2009-02-28 5 views
8

je mis à jour manuellement ce code de liaison WPF:la liaison OneWay travail arrête après la cible

TestModel source = new TestModel(); 
TestModel target = new TestModel(); 

Bind(source, target, BindingMode.OneWay); 

source.Attribute = "1"; 
AssertAreEqual(target.Attribute, "1"); 

target.Attribute = "foo"; 

source.Attribute = "2"; 
AssertAreEqual(target.Attribute, "2"); 

La seconde assertion échoue! Cela semble étrange pour moi.

En outre, j'ai essayé 'OneWayToSource' au lieu de 'OneWay', et tout fonctionne comme prévu.

Bind(source, target, BindingMode.OneWayToSource); 

target.Attribute = "1"; 
AssertAreEqual(source.Attribute, "1"); 

source.Attribute = "foo"; 

target.Attribute = "2"; 
AssertAreEqual(source.Attribute, "2"); 

Autres détails:

void Bind(TestModel source, TestModel target, BindingMode mode) 
{ 
    Binding binding = new Binding(); 
    binding.Source = source; 
    binding.Path = new PropertyPath(TestModel.AttributeProperty); 
    binding.Mode = mode; 
    BindingOperations.SetBinding(target, TestModel.AttributeProperty, binding); 
} 

class TestModel : DependencyObject 
{ 
    public static readonly DependencyProperty AttributeProperty = 
     DependencyProperty.Register("Attribute", typeof(string), typeof(TestModel), new PropertyMetadata(null)); 

    public string Attribute 
    { 
     get { return (string)GetValue(AttributeProperty); } 
     set { SetValue(AttributeProperty, value); } 
    } 
} 

Quel est le problème avec mon code?

Répondre

13

Réglage target.Attribute = "foo"; dégagé la liaison.

MSDN:

Non seulement les ressources dynamiques et liaisons fonctionnent en même priorité en tant que valeur locale, ils sont vraiment une valeur locale, mais avec une valeur qui est reporté. Une conséquence de ceci est que si vous avez une ressource dynamique ou la liaison à place pour une valeur de propriété, une valeur locale que vous définissez ensuite remplace la liaison entièrement la liaison ou dynamique. Même si vous appelez ClearValue pour effacer la valeur définie localement , la ressource dynamique ou la liaison ne sera pas restaurée. En fait, si appelez ClearValue sur une propriété qui a une ressource dynamique ou une liaison en place (sans valeur locale "littérale"), ils sont également effacés par l'appel ClearValue .

1

Je ne suis pas un expert en liaison, mais je crois que vous rencontrez des problèmes de priorité de propriété de dépendance WPF. Il est probable que la définition directe de la valeur a priorité sur la valeur de liaison. C'est pourquoi il remplace la liaison.

Voici une liste de pleine propriété de dépendance: http://msdn.microsoft.com/en-us/library/ms743230.aspx

+0

Cela fait que la valeur définie par le style remplacera la valeur du modèle, et la valeur locale remplacera la valeur du style, etc. Mais je n'ai rien de tout cela. Donc pas sûr que cela explique le problème ... Merci de toute façon. – alex2k8

+0

En outre, cela n'explique pas la différence entre OneWay et OneWayToSource – alex2k8

-1

Si vous définissez le mode de liaison à OneWay, cela signifie que les travaux de liaison que d'une manière: la cible est mis à jour lorsque le changement de la source.

Mais la cible doit être une propriété de dépendance et le code que vous possédez est une propriété CLR .NET. Vous devez définir la valeur sur la cible en utilisant le nom de la propriété de dépendance enregistrée, pas simplement un nom de propriété .NET ordinaire. La réponse de Jared est tout à fait correcte, cela pourrait apporter de la confusion dans la résolution des conflits entre la propriété de dépendance WPF et la propriété .NET CLR ordinaire. Si vous suivez la convention, la propriété de dépendance doit avoir la forme d'une propriété "propertyname" +. Exemple: TextProperty est la propriété de dépendance "Text" de TextBox. L'appel dans le code ci doit être:

TextBox1.TextProperty="value"; 

Pour plus d'informations sur la configuration de la source de liaison:

http://msdn.microsoft.com/en-us/library/ms743643.aspx

+0

J'ai ajouté le TestModel pour éviter la confusion ... Aussi, s'il vous plaît, voir ma méthode de liaison - J'utilise la propriété WPF depenency. J'utilise le wrapper de propriétés CLR juste pour définir la valeur de propriété WPF ... Aussi, TextBox1.TextProperty = "value"; Que voulez-vous dire? L'occurrence TextBox a uniquement la propriété Text. – alex2k8

0

Exemple: TextProperty est "Texte" de propriété de dépendance de TextBox. Les appeler dans le code devrait être:

TextBox1.TextProperty = "value";

propriétés WPF peuvent être définies de deux façons:. en invoquant la méthode DependencyObject.SetValue (. Par exemple instance.SetValue (TextProperty, "texte")) ou utilisant Wrapper CLR (par exemple instance.Text = » Du texte").

TextBox.TextProperty est un objet DependencyProperty statique, vous ne pouvez donc pas affecter de valeur de chaîne à un type de référence.

Questions connexes