在我的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 :(得分:1)
此:
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