单向绑定工作,双向绑定不

问题描述:

在我的Silverlight prjoect我创建一个简单的双向代码绑定:单向绑定工作,双向绑定不

这是我要绑定属性:

public class Selection : ViewModelBase { 

    private string selectedModel; 

    public string SelectedModel { 
     get { return selectedModel; } 
     set { 
      selectedModel = value; 
      FirePropertyChanged("SelectedModel"); 
     } 
    } 
} 

我的绑定目标是富文本框的文本属性。

我的绑定代码如下:

Selection s = getSelectionObject(); 

Binding modelBinding = new Binding("SelectedModel"); 
modelBinding.Source = s.SelectedModel; 
selectorContent.usc_ModelSelector.SetBinding(GSelector.TextProperty, modelBinding); 

这工作正常!每当Selection对象的SelectedModel属性更改时,富文本框都会相应地得到通知和更新。但它只是单向绑定,我需要双向绑定。所以我试图通过改变上面的代码来改变绑定模式:

Binding modelBinding = new Binding("SelectedModel"); 
modelBinding.Path = new PropertyPath(s.SelectedModel); 
modelBinding.Source = s.SelectedModel; 
modelBinding.Mode = BindingMode.TwoWay; 
selectorContent.usc_ModelSelector.SetBinding(GSelector.TextProperty, modelBinding); 

但是,这是行不通的。它编译,但现在似乎没有任何效果。不仅如此,我无法在ViewModel中触发更改(在SelectedModel属性中的Selection类中 - 当双向绑定可以正常工作时应该起作用)当更改RichTextBox的文本时,我甚至不能请参阅使用上述代码的单向绑定!

看来,线

modelBinding.Path = new PropertyPath(s.SelectedModel); 

是问题的根源,因为当我设置s.SelectedModel为绑定Path属性则modelBinding对象的Path属性似乎有正确的值(其在调试过程中,在runtine中显示了对象内部的外观 - 这是一个字符串值),但我无法在富文本框中看到任何更改。

将代码恢复为单向绑定版本会立即使富文本框再次发挥作用。

任何人都可以帮忙吗?我已经花了几个小时在这一点,我真的要赶上客户的期限。所以任何帮助,将不胜感激:)提前感谢...

+0

你为什么要添加属性路径线磨片所有你想要做的就是将模式更改为双向? – 2012-01-16 00:27:02

此:

new Binding("SelectedModel"); 

创建一个新的与路径"SelectedModel"绑定。然后你继续用这条线覆盖正确的路径:

modelBinding.Path = new PropertyPath(s.SelectedModel); 

哪一个不行;所述constructor reference状态:

,要么描述为公共语言运行库(CLR)属性,或一个单一的依赖属性的路径的属性的路径。

因此,无论是使用字符串还是对DP的引用。

无论如何,我不认为你需要那条线,因为你已经在绑定构造函数中正确地设置了路径。

编辑:您的源语言错误!

源应该是包含属性的对象,这里是s

Binding modelBinding = new Binding("SelectedModel"); 
modelBinding.Source = s; 
modelBinding.Mode = BindingMode.TwoWay; // This might be optional depending on the default mode of the target property 
+0

嗨,谢谢你的回答。我确实可以删除Binding(“SelectdModel”)中的“SelectedModel”参数,但是我没有改变我的情况,我认为没有任何区别。具有显式Path属性的行是必需的,因为如果我将其删除,编译器会说:“双向绑定需要Path。”请进一步的想法吗? :) – 2012-01-16 00:26:39

+0

@Marc:不,不应该,你应该离开Binding构造*,因为它是*,只是删除你覆盖路径的行,你必须有其中一个(但只有构造是正确的,所以留下) 。 – 2012-01-16 00:28:51

+0

有趣的是,当我通过绑定构造函数设置Path时,绑定对象的Path属性被初始化,但其“Path”属性保留为空。另一方面,当我明确地设置绑定的路径,就像在modelBindinf.Path = ...比Path属性获得初始化,并且路径的Path属性(我有点困惑,我知道)现在具有字符串值,其中是我想带的价值。 – 2012-01-16 00:29:55