2010-10-07 8 views
7

La liaison à une propriété de dépendance est facilitée par le code-behind. Vous venez de créer un nouvel objet System.Windows.Data.Binding, puis appelez la méthode SetBinding de l'objet de dépendance cible.Liaison de données à la propriété CLR dans le code-behind

Mais comment faites-vous cela lorsque la propriété que nous lions est une propriété CLR et que vous ne pouvez pas fournir un argument DependencyProperty à SetBinding?

EDIT: L'objet implémente INotifyPropertyChanged, si cela est pertinent.

Répondre

0

Si je comprends bien votre question, vous avez un FrameworkElement qui expose une propriété ordinaire ancienne plaine qui n'est pas sauvegardé comme Propriété de dépendance. Cependant, vous souhaitez le définir comme cible d'une liaison.

Tout d'abord, il est peu probable que la liaison TwoWay fonctionne, et dans la plupart des cas impossible. Cependant, si vous voulez seulement une liaison à sens unique, vous pouvez créer une propriété jointe en tant que substitut pour la propriété réelle. Imaginons que je possède un élément de structure StatusDisplay qui possède une propriété de chaîne Message qui, pour une raison vraiment stupide, ne prend pas en charge Message comme propriété de dépendance.

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

Bien sûr, si le contrôle StatusDisplay a sa Message propriété modifiée directement pour quelque raison que l'état de cette substitution ne correspond plus. Cela n'a peut-être pas d'importance pour vos objectifs.

0

Attendre. Essayez-vous de lier 2 propriétés CLR? Laissez-moi vous dire qu'une telle chose est impossible à réaliser normalement. par exemple. aucun genre de piratage hardcore qui peut rendre toute votre application instable. Un côté de la liaison DOIT être DependencyProperty. Période.

0

Vous pouvez lier une propriété CLR à un DepenencyProperty sur un contrôle, par exemple. Dans ce cas, la propriété CLR est la SOURCE de la liaison et DependencyProperty est la CIBLE de la liaison. Pour que cela fonctionne, la classe avec la propriété CLR doit implémenter INotifyPropertyChanged.

Voilà comment vous le faites dans le code derrière:

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

Dans ce cas, l'objet de liaison représente les informations sur la source: Quel objet est la source, qui propriété de cet objet est celui que vous BindingOperations.SetBinding est une méthode statique qui spécifie quel DependencyProperty sur lequel DependencyObject est la cible de la liaison (arguments 2 & 1, respectivement), et la liaison à utiliser pour obtenir à la source.

HTH

Tony