You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中ViewModel数据无法绑定到自定义UserControl问题求助

问题原因

你在TestUserControl的XAML根节点显式设置了DataContext="{Binding RelativeSource={RelativeSource Self}}",这会将UserControl自身的DataContext覆盖为自身实例,而非继承父级Window的MainWindowViewModel。
当你在MainWindow中写<uc:TestUserControl Test="{Binding Test}"时,这个绑定默认会使用TestUserControl自己的DataContext(也就是它自身)来查找Test属性,而非你预期的外层MainWindowViewModel,因此绑定拿到的是空值,导致内部TextBox显示为空。
硬编码赋值能正常工作的原因是,硬编码不需要走DataContext绑定逻辑,直接给Test依赖属性赋值,不受DataContext影响。

修复方案

推荐采用自定义控件的标准实践方案,不破坏控件的DataContext继承:

  1. 删掉TestUserControl根节点的DataContext="{Binding RelativeSource={RelativeSource Self}}"代码
  2. 将TestUserControl内部TextBox的绑定改为显式查找父级控件作为源,修改后代码如下:
<TextBox HorizontalAlignment="Left"
         TextWrapping="Wrap"
         VerticalAlignment="Top"
         Width="120"
         Text="{Binding Test, RelativeSource={RelativeSource AncestorType=local:TestUserControl}, PresentationTraceSources.TraceLevel=High}" />

这样修改后,UserControl不会主动修改自身的DataContext,外层传入的绑定会正常继承Window的DataContext,从MainWindowViewModel拿到Test属性值,内部TextBox也可以通过RelativeSource正确读取自身依赖属性的Test值。

如果不想修改UserControl内部代码,也可以在MainWindow绑定时显式指定源,示例如下:

<uc:TestUserControl Grid.Row="1" Test="{Binding DataContext.Test, RelativeSource={RelativeSource AncestorType=Window}, PresentationTraceSources.TraceLevel=High}" />

该方案不需要修改UserControl,但使用控件时需要额外指定绑定源,不符合通用控件的使用习惯,不推荐。

内容的提问来源于stack exchange,提问作者Martin Braun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:36:05