2010-10-07 18 views
7

Bindung an eine Abhängigkeitseigenschaft ist einfach in Code-behind. Sie erstellen einfach ein neues System.Windows.Data.Binding-Objekt und rufen dann die SetBinding-Methode des Zielabhängigkeitsobjekts auf.Datenbindung an CLR-Eigenschaft in Code-Behind

Aber wie machen Sie das, wenn die Eigenschaft, die wir binden, eine CLR-Eigenschaft ist und Sie kein DependencyProperty-Argument an SetBinding liefern können?

EDIT: Das Objekt implementiert INotifyPropertyChanged, wenn das relevant ist.

Antwort

0

Wenn ich Ihre Frage richtig verstehe Sie eine FrameworkElement haben, die eine einfache alte gewöhnliche Eigenschaft macht, die nicht oben als gesichert ist Abhängigkeitseigenschaft Sie möchten es jedoch als Ziel einer Bindung festlegen.

Zunächst wäre es unwahrscheinlich und in den meisten Fällen unmöglich, TwoWay-Bindung an die Arbeit zu bringen. Wenn Sie jedoch nur eine Möglichkeit zur Bindung haben möchten, können Sie eine angefügte Eigenschaft als Ersatz für die tatsächliche Eigenschaft erstellen.

Lets imagine Ich habe ein StatusDisplay Framework-Element, das eine Zeichenfolge Message Eigenschaft hat, die für einige wirklich dumme Grund Message als Abhängigkeitseigenschaft nicht unterstützt.

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; 
    } 
} 

Natürlich, wenn die StatusDisplay Kontrolle seiner Message Eigenschaft hat direkt der Zustand dieses Surrogat aus irgendeinem Grund geändert werden nicht mehr entsprechen. Trotzdem ist das für Ihre Zwecke nicht wichtig.

0

Warten. Versuchen Sie, 2 CLR-Eigenschaften zu binden? Lassen Sie mich sagen, dass so etwas auf normale Weise unmöglich zu erreichen ist. z.B. keine Art von Hardcore-Hack, der Ihre gesamte Anwendung instabil machen kann. Eine Seite der Bindung muss DependencyProperty sein. Zeitraum.

0

Sie können beispielsweise eine CLR-Eigenschaft an eine DepenencyProperty eines Steuerelements binden. In diesem Cae ist die CLR-Eigenschaft die QUELLE der Bindung und die DependencyProperty ist das TARGET der Bindung. Damit es funktioniert, muss die Klasse mit der CLR-Eigenschaft INotifyPropertyChanged implementieren.

Hier ist, wie Sie es im Code tun hinter:

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

In diesem Fall wird das Binding-Objekt die Information über die Quelle darstellt: Welche Aufgabe die Quelle ist, die Eigenschaft des Objekts ist, die Sie Bin interessiert. BindingOperations.SetBinding ist eine statische Methode, die angibt, welche DependencyProperty für welches DependencyObject das Ziel der Bindung ist (Argumente 2 & 1) und die zu verwendende Bindung an der Quelle.

HTH

Tony