2010-10-07 11 views
7

Powiązanie z zależnością Właściwość jest łatwa w kodowaniu. Po prostu stwórz nowy obiekt System.Windows.Data.Binding, a następnie wywołaj metodę obiektu zależności SetBinding docelowego obiektu docelowego.Databinding do właściwości CLR z kodem

Ale jak to zrobić, gdy właściwość, która jest wiążąca, jest właściwością CLR i nie można podać argumentu DependencyProperty dla SetBinding?

EDYCJA: Obiekt implementuje INotifyPropertyChanged, jeśli jest to istotne.

Odpowiedz

0

Jeśli dobrze rozumiem pytanie masz FrameworkElement że naraża zwykły stary obiekt, który nie jest zwykłą kopię zapasową jako Właściwość Dependency. Jednak chcesz ustawić go jako cel wiązania.

Po pierwsze uzyskanie wiązania TwoWay do pracy byłoby mało prawdopodobne iw większości przypadków niemożliwe. Jednak jeśli chcesz tylko jeden sposób wiązania, możesz utworzyć dołączoną właściwość jako surogat dla rzeczywistej własności.

Pozwala wyobrazić Mam element StatusDisplay ramową, która ma ciąg Message właściwość, że z jakiegoś powodu naprawdę głupi nie obsługuje Message jako właściwość zależność.

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

Oczywiście jeśli kontrola StatusDisplay ma swój Message właściwość zmodyfikowaną bezpośrednio z jakiegokolwiek powodu stan ten surogat nie będzie pasować. Nadal może to nie mieć znaczenia dla twoich celów.

0

Czekaj. Czy próbujesz powiązać 2 właściwości CLR? Powiem, że w normalny sposób nie można tego osiągnąć. na przykład. żadnego rodzaju hackera, który może spowodować niestabilność całej aplikacji. Po jednej stronie wiązania MUSI być DependencyProperty. Kropka.

0

Można na przykład powiązać właściwość CLR z atrybutem DepenencyProperty na formancie. W tym cae właściwość CLR jest SOURCE wiązania, a DependencyProperty to TARGET wiązania. Aby to działało, klasa z właściwością CLR musi implementować INotifyPropertyChanged.

Oto jak to zrobić w kodzie za:

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

W tym przypadku wiązanie obiekt reprezentuje informacje o Źródło: Jaki przedmiot jest źródłem, którego właściwością tego obiektu jest jeden ty "Interesuje mnie. BindingOperations.SetBinding jest statyczną metodą, która określa, na czym polega DependencyProperty, na której DependencyObject jest celem wiązania (odpowiednio, argumenty: 2 & 1), oraz Binding do użycia w celu uzyskania źródła.

HTH

Tony