如何在代码隐藏中创建没有指定Path的绑定?
本文关键字:Path 绑定 代码 隐藏 创建 | 更新日期: 2023-09-27 18:16:35
我正在回答另一个关于在代码隐藏中创建绑定的问题,我最初试图回答这个问题是发布没有指定Path
的绑定代码。这个绑定可以很好地编译,但是该值永远不会更新。如果我将绑定更改为使用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;
绑定引擎订阅Source
对象上的INPC和DP-changes (Path
对象上的non-leaves),并检查Path
属性是否被更改。如果没有Path
,则没有通知。一个相当不幸的缺点。
(我可能对系统过于简化了一点,但本质是没有对源更改的更新,它们不是也不能被监视)
{Binding}
相当于new Binding()
(没有额外的属性),这个绑定可能会随着DataContext
变化的事件而更新。
Binding.Source
输入为System.Object
。所以当你这样做的时候:
b.Source = SomeInt;
你将值类型(System.Int32
)赋值给System.Object
类型的东西,这意味着你将获得原始值的盒装副本。
盒装副本存在于堆上,与原始变量没有关系。当您修改原始变量时,盒装副本不会发生任何变化。