WPF自定义UserControl属性双向绑定更新无通知问题排查
WPF UserControl双向绑定不生效修复方案
核心问题列表
- 主窗口XAML重复设置DataContext,覆盖了构造函数中绑定的视图模型实例
- UserControl中
ComboValues依赖属性类型定义不匹配,注册时声明为List<int>,属性访问器却错误使用了string类型 - UserControl内部输入控件的绑定未开启双向同步和属性变更触发规则,值变更无法同步到依赖属性
分步修复操作
1. 清理主窗口重复的DataContext设置
删除主窗口XAML根节点中的DataContext="{Binding RelativeSource={RelativeSource Self}}"属性,保留构造函数中DataContext = textBinding;的设置即可。
2. 修正ComboValues依赖属性类型
修改UserControl的C#代码,将ComboValues属性的访问器类型调整为和注册时一致的List<int>:
public List<int> ComboValues { get => (List<int>)GetValue(ComboValuesProperty); set => SetValue(ComboValuesProperty, value); }
3. 开启UserControl内部控件的双向绑定
修改UserControl的XAML代码,给输入控件的绑定加上双向同步和属性变更触发配置:
<TextBox Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:UserControlTest1}}, Path=TextValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="0,47,0,0" TextWrapping="Wrap" HorizontalAlignment="Center" VerticalAlignment="Top" Width="119" Height="20"/> <ComboBox ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:UserControlTest1}}, Path=ComboValues}" SelectedValue="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:UserControlTest1}}, Path=ComboSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" DisplayMemberPath="" SelectedValuePath="" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="0,84,0,0" Width="118"/>
效果验证
修复完成后,主窗口和UserControl的输入控件值可以双向同步,任意一端修改都会实时同步到另一端。
内容的提问来源于stack exchange,提问作者Yaegaki2
相关产品推荐
相关产品推荐

