如何在代码隐藏中创建没有指定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;

如何在代码隐藏中创建没有指定Path的绑定?

绑定引擎订阅Source对象上的INPC和DP-changes (Path对象上的non-leaves),并检查Path属性是否被更改。如果没有Path,则没有通知。一个相当不幸的缺点。

(我可能对系统过于简化了一点,但本质是没有对源更改的更新,它们不是也不能被监视)


{Binding}相当于new Binding()(没有额外的属性),这个绑定可能会随着DataContext变化的事件而更新。

Binding.Source输入为System.Object。所以当你这样做的时候:

b.Source = SomeInt;

你将值类型(System.Int32)赋值给System.Object类型的东西,这意味着你将获得原始值的盒装副本。

盒装副本存在于堆上,与原始变量没有关系。当您修改原始变量时,盒装副本不会发生任何变化。