如何将ComboBox CB1的文本绑定到CB2的ValidationRule并解决绑定报错
错误原因
WPF绑定机制要求绑定目标必须是DependencyObject的依赖属性,而ValidationRule类默认直接继承自Object,不属于DependencyObject子类,你定义的CommunicationMode是普通CLR属性,自然无法直接设置绑定,所以会触发该报错。
可行解决方案(最通用的BindingProxy中转方案)
步骤1:创建绑定代理类
该类继承自Freezable(属于DependencyObject子类,可正常使用绑定),用来中转CB1的文本值:
public class BindingProxy : Freezable { protected override Freezable CreateInstanceCore() { return new BindingProxy(); } public static readonly DependencyProperty DataProperty = DependencyProperty.Register( nameof(Data), typeof(object), typeof(BindingProxy)); public object Data { get => GetValue(DataProperty); set => SetValue(DataProperty, value); } }
步骤2:在XAML资源中声明代理,绑定CB1的Text
在页面/窗口的资源节点中添加代理实例,提前绑定好CB1的文本:
<Window.Resources> <!-- 替换xmlns:local为你BindingProxy所在的命名空间 --> <local:BindingProxy x:Key="Cb1TextProxy" Data="{Binding ElementName=CB1, Path=Text}" /> </Window.Resources>
步骤3:修改CB2的验证规则赋值
通过静态资源拿到代理中转的CB1文本,赋值给CommunicationMode:
<valid:ComboboxValidationRule CommunicationMode="{Binding Data, Source={StaticResource Cb1TextProxy}}" ValidatesOnTargetUpdated="True"/>
额外注意
你原XAML中两个ComboBox的Text绑定Path="CB1"、Path="CB2"需要确认你的DataContext中存在对应名称的属性,否则这部分绑定也会失效。
内容的提问来源于stack exchange,提问作者patrickgc
相关产品推荐
相关产品推荐

