2010-10-07 13 views
7

Il collegamento a una proprietà di dipendenza è facile in code-behind. È sufficiente creare un nuovo oggetto System.Windows.Data.Binding e quindi chiamare il metodo SetBinding dell'oggetto di dipendenza target.Associazione di codici alle proprietà CLR nel codice

Ma come si fa quando la proprietà che stiamo vincolando è una proprietà CLR e non è possibile fornire un argomento DependencyProperty a SetBinding?

MODIFICA: L'oggetto implementa INotifyPropertyChanged, se pertinente.

risposta

0

Se ho capito bene la tua domanda si dispone di una FrameworkElement che espone una pianura vecchia proprietà comune che non viene eseguito il backup come Proprietà di dipendenza. Tuttavia, si desidera impostarlo come obiettivo di una rilegatura.

Prima di ottenere il binding di TwoWay sul lavoro sarebbe improbabile e nella maggior parte dei casi impossibile. Tuttavia, se si desidera un collegamento unidirezionale, è possibile creare una proprietà associata come surrogato della proprietà effettiva.

Immaginiamo di avere un elemento quadro StatusDisplay con una stringa Message proprietà che per qualche motivo davvero stupido non supporta Message come proprietà di dipendenza.

public static StatusDisplaySurrogates 
{ 
    public static string GetMessage(StatusDisplay element) 
    { 
     if (element == null) 
     { 
      throw new ArgumentNullException("element"); 
     } 
     return element.GetValue(MessageProperty) as string; 
    } 

    public static void SetMessage(StatusDisplay element, string value) 
    { 
     if (element == null) 
     { 
      throw new ArgumentNullException("element"); 
     } 
     element.SetValue(MessageProperty, value); 
    } 

    public static readonly DependencyProperty MessageProperty = 
     DependencyProperty.RegisterAttached(
      "Message", 
      typeof(string), 
      typeof(StatusDisplay), 
      new PropertyMetadata(null, OnMessagePropertyChanged)); 

    private static void OnMessagePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     StatusDisplay source = d as StatusDisplay; 
     source.Message = e.NewValue as String; 
    } 
} 

Naturalmente se il controllo StatusDisplay ha la proprietà Message modificato direttamente per qualsiasi motivo, lo stato di questo surrogata non sarà più corrispondere. Ciò potrebbe non essere importante per i tuoi scopi.

0

Attendere. Stai cercando di associare 2 proprietà CLR ?? Lasciatemi dire che una cosa del genere è impossibile da ottenere in modo normale. per esempio. nessun tipo di hack hardcore che possa rendere instabile la tua intera applicazione. Un lato del binding DEVE essere DependencyProperty. Periodo.

0

È possibile associare una proprietà CLR a una proprietà di dipendenza su un controllo, ad esempio. In questo caso, la proprietà CLR è la SORGENTE del binding e DependencyProperty è il TARGET del binding. Affinché funzioni, la classe con la proprietà CLR deve implementare INotifyPropertyChanged.

Ecco come si fa nel codice dietro:

Binding canModifyBinding = new Binding(); 
canModifyBinding.Source = LastRecord; 
canModifyBinding.Path = new PropertyPath("CanModify"); 
BindingOperations.SetBinding(this, CanModifyProperty, canModifyBinding); 

In questo caso, l'oggetto associazione rappresenta le informazioni sulla sorgente: Quale oggetto è la fonte, che di proprietà di tale oggetto è quella che si sei interessato a. BindingOperations.SetBinding è un metodo statico che specifica quale DependencyProperty su cui DependencyObject è il target del binding (argomenti 2 & 1, rispettivamente) e il Binding da utilizzare per ottenere il codice sorgente.

HTH

Tony

Problemi correlati