如何修改DependencyProperty本地值且不清除绑定并触发源更新?
WPF依赖属性绑定:OneWay模式下本地赋值能否更新源?
背景场景回顾
自定义UserControl的依赖属性标准实现:
public static readonly DependencyProperty MyStringProperty = DependencyProperty.Register( nameof(MyString), typeof(string), typeof(MyCustomControl), new PropertyMetadata(default(string))); public string MyString { get { return (string)GetValue(MyStringProperty); } set { SetValue(MyStringProperty, value); } }
绑定用法:
<MyCustomControl MyString="{Binding SomeDataContextProperty}"/>
已知事实:
- 直接通过
MyString = "NewValue"赋值会破坏绑定关系,因为本地值会覆盖绑定引用; - 使用
SetCurrentValue可以保留绑定,但不会触发绑定源SomeDataContextProperty的更新。
核心问题结论
OneWay绑定模式下,无论用哪种方式设置目标依赖属性的本地值,都不会触发绑定源的更新。
原因说明
OneWay绑定的设计逻辑是仅单向同步:从源属性流向目标依赖属性。只有当源属性SomeDataContextProperty发生变化时,才会自动同步到目标MyString属性;反过来,目标属性的任何修改(包括直接赋值、SetCurrentValue设置有效值)都不会反向同步回源。
如果需要实现目标属性修改后同步回源的效果,必须将绑定模式改为TwoWay:
- 此时用
SetCurrentValue修改目标属性,会在保留绑定关系的同时,将值同步回绑定源; - 但直接用
MyString = "NewValue"赋值依然会破坏绑定,因为本地值的优先级高于绑定,会直接替换掉绑定引用。
OneWay模式下更新源的替代方案
如果必须使用OneWay绑定,又要更新源,只能直接修改源对象的SomeDataContextProperty属性,而不是通过修改目标依赖属性间接操作。
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

