2011-12-13 3 views
4

Je rencontre des problèmes de liaison avec une classe personnalisée. La propriété dependency ne semble pas obtenir la valeur correcte de mon viewmodel. Voici ma classe personnalisée:Liaison à DependencyProperty sur la classe personnalisée

public class DataResource : DependencyObject 
     { 

      public static readonly DependencyProperty ContentProperty = 
       DependencyProperty.Register("Content", 
        typeof(object), 
        typeof(DataResource)); 

      public object Content 
      { 
       get { return (object)GetValue(ContentProperty); } 
       set { SetValue(ContentProperty, value); } 
      } 

     } 

Et dans mes ressources UserControl, j'ai:

<UserControl.Resources> 
     <local:DataResource x:Key="dataResource" Content="{Binding Test}"></data:DataResource> 
    </UserControl.Resources> 

dans mon ViewModel « Test » est une propriété que je peux lier une étiquette à sans aucun problème. Est-ce que je fais quelque chose de mal ici dans cette implémentation?

Mise à jour: Cela fonctionne si j'hérite de Freezable au lieu de DependencyObject. Je ne suis pas tout à fait sûr pourquoi, j'espère que quelqu'un peut expliquer cela.

Répondre

3

Il n'y a pas de contexte dans le Resources, le DataResource aurait besoin d'être placé quelque part dans le UserControl afin qu'il puisse hériter du DataContext de sorte que la liaison (qui est par rapport à la DataContext si une source est définie) est terminée.

(Un problème qui est que DependencyObject n'ont même pas un « vrai » DataContext comme cette propriété appartient à FrameworkElement, si vous êtes chanceux il y a un contexte artificiel si)

+0

Si je change ma classe DataResource pour prolonger de FrameworkElement, ce que je n'ai un contexte encore? Je peux utiliser une CollectionViewSource dans mes ressources et la liaison fonctionne correctement puisque mon UserControl a déjà l'ensemble DataContext. – dbomb7

+0

Peut-être que cela fonctionne via [contexte de l'héritage] (http://blogs.msdn.com/b/nickkramer/archive/2006/08/18/705116.aspx), je ne suis pas sûr cependant. Mais changer le type en 'FrameworkElement' n'est certainement pas le bon pas à faire, car vous ne pouvez pas vraiment vous lier au DataContext actuel, vous devriez considérer une autre source, comme 'ElementName' ou' Source' et spécifier un chemin par rapport à cette source. –

0

Vous pouvez également utiliser la FrameworkElement Méthode .SetBinding sur la propriété Dependency dans votre code derrière. Ensuite, vous n'avez pas besoin de définir le contexte de données pour la page entière (puisque DataContext et DP ne se mélangent pas bien).

Voici le MSDN sur ce point: http://msdn.microsoft.com/en-us/library/ms598273.aspx

Exemple:

MyData myDataObject = new MyData(DateTime.Now);  
Binding myBinding = new Binding("MyDataProperty"); 
myBinding.Source = myDataObject; 
myText.SetBinding(TextBlock.TextProperty, myBinding); 
+0

À quoi cela ressemblerait-il dans xaml? – dbomb7

+0

Cette méthode est utilisée pour contourner la liaison XAML. Je finis par le faire beaucoup dans Silverlight à cause de conflits de liaison ou de DP qui ne déclenchent pas correctement les changements sur les contrôles utilisateur. Ça vaut le coup, mais ça doit être dans le code derrière. – Xcalibur37

Questions connexes