我正在回答another question关于在代码隐藏中创建绑定的问题,而我最初的回答是发布未指定Path
的绑定代码。此绑定编译正常,但值永远不会更新。如果我更改绑定以使用路径,它可以正常工作。
这是为什么?在没有Path的代码隐藏中创建绑定的正确方法是什么?例如,如何在代码隐藏中重新创建Value="{Binding }"
?
非工作代码:
Binding b = new Binding();
b.Source = SomeInt;
b.Mode = BindingMode.OneWay;
MyProgressBar.SetBinding(ProgressBar.ValueProperty, b);
SomeInt = 50;
工作代码:
Binding b = new Binding();
b.Source = this;
b.Path = new PropertyPath("SomeInt");
MyProgressBar.SetBinding(ProgressBar.ValueProperty, b);
SomeInt = 50;
答案 0 :(得分:3)
绑定引擎订阅INPC和DP - Source
对象上的更改(以及Path
上的非离开),并检查{{1}属性/属性被更改了。如果没有Path
则没有通知。一个相当不幸的缺点。
(我可能会过度简化系统,但实质上是没有源更改的更新,它们不会也无法监控)
Path
相当于{Binding}
(没有其他属性),此绑定可能会更新,因为有new Binding()
更改的事件。
答案 1 :(得分:1)
Binding.Source
的输入为System.Object
。所以当你这样做时:
b.Source = SomeInt;
您要将值类型(System.Int32
)分配到System.Object
类型的内容中,这意味着您将获得原始值的盒装副本。
盒装副本存在于堆上,与原始变量无关。修改原始变量时,盒装副本没有任何反应。