2010-10-15 12 views
7

Ho letto le proprietà di dipendenza per alcuni giorni e ho compreso come recuperare il valore anziché impostarlo/recuperarlo come nelle proprietà CLR. Sentiti libero di correggermi se sbaglio.Come creare una proprietà Dipendenza su un controllo esistente?

Dalla mia comprensione tutti i controlli WPF come un TextBlock, Button ecc che derivano da DependencyObject conterrebbero anche proprietà di dipendenza per memorizzare i loro valori, invece di usare le proprietà CLR. Questo ha il vantaggio di sovrascrivere i valori locali nel caso in cui vengano utilizzate animazioni o ereditare valori se non è impostato alcun valore locale ecc.

Ora sto cercando di trovare alcuni esempi per creare e utilizzare il mio dp.

1) È possibile creare la mia proprietà di dipendenza su un controllo WPF esistente? Diciamo che vorrei una proprietà di dipendenza di tipo intero sulla classe WPF Textblock? O devo creare una nuova classe derivata da TextBlockBase per creare la mia proprietà di dipendenza qui sopra?

2) In entrambi i casi, diciamo che ho creato una proprietà di dipendenza su una classe di blocco di testo WPF. Ora mi piacerebbe utilizzarlo legando il contenuto dell'etichetta alla proprietà di dipendenza di TextBlock. In modo che l'etichetta mostrasse sempre il valore reale del dp di TextBlock, indipendentemente dal fatto che sia ereditato o impostato localmente.

Speriamo che qualcuno mi può aiutare con questi due esempi ... Molte grazie, Kave

risposta

6

È possibile utilizzare attached properties per esso.

definire il vostro MyInt bene: il marchio del contenuto


namespace WpfApplication5 
{ 
    public class MyProperties 
    { 
     public static readonly System.Windows.DependencyProperty MyIntProperty; 

     static MyProperties() 
     { 
      MyIntProperty = System.Windows.DependencyProperty.RegisterAttached(
       "MyInt", typeof(int), typeof(MyProperties)); 
     } 

     public static void SetMyInt(System.Windows.UIElement element, int value) 
     { 
      element.SetValue(MyIntProperty, value); 
     } 

     public static int GetMyInt(System.Windows.UIElement element) 
     { 
      return (int)element.GetValue(MyIntProperty); 
     } 
    } 
} 

Bind:


<Window x:Class="WpfApplication5.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication5" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <Label Margin="98,115,51,119" Content="{Binding Path=(local:MyProperties.MyInt), RelativeSource={x:Static RelativeSource.Self}}" local:MyProperties.MyInt="42"/> 
    </Grid> 
</Window> 
+0

grazie, questo è anche una buona alternativa, che cercherò presto . – Houman

1

non puoi aggiungere DependencyProperties al tipo esistente. Mentre è possibile utilizzare AttachedProperty, la logica dietro l'utilizzo e derivare nuovo tipo è completamente diversa.

Nel tuo caso, consiglierei di derivare un nuovo tipo. Soprattutto perché la tua logica è legata a questo tipo. Questo è fondamentale dietro l'ereditarietà e non è legato alle proprietà di dipendenza.

In AttachedProperty stai dando a un altro oggetto un valore di valori in oggetto diverso. Qualcosa come Grid.Row sta dando alla Grid la sua infanzia e come dovrebbe posizionarla. L'oggetto in cui è impostata questa proprietà non è a conoscenza di nulla.

+0

grazie. Perché dovrei voler creare mai dp? Ho letto che alcune persone creano i propri. Mi piacerebbe vedere un esempio in cui ha senso creare il tuo dp ... – Houman

0

Ecco un esempio su un ovveride dell'elemento Run:

using System; 
using System.Windows; 
using System.Windows.Documents; 

namespace MyNameSpace.FlowDocumentBuilder 
{ 
    public class ModifiedRun : Run 
    { 
     static DateRun() 
     { 
      TextProperty.OverrideMetadata(typeof(DateRun),new FrameworkPropertyMetadata(string.Empty,FrameworkPropertyMetadataOptions.Inherits,null,CoerceValue)); 
     } 

     private static object CoerceValue(DependencyObject d, object basevalue) 
     { 
      return "AAAAAAAA"; 
     } 
    } 
} 

Un corrispondente XAML è:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         ColumnWidth="400" 
         FontSize="14" 
         FontFamily="Arial" 
xmlns:local="clr-namespace:MyNameSpace.FlowDocumentBuilder;assembly=MyNameSpace.FlowDocumentBuilder" 
> 

<Paragraph><local:ModifiedRun Text="BBBBBBBBBB"/></Paragraph> 

</FlowDocument> 
Problemi correlati