WPF自定义用户控件绑定报错:无法将Data.Binding转换为System.String
错误原因
- 自定义控件的
TextToDisplay是普通CLR属性,不支持作为XAML绑定的目标:WPF中只有依赖属性才能接收{Binding}语法的绑定赋值,普通属性会尝试直接把Binding对象转为string类型,直接触发类型转换失败报错。 - 用户控件构造函数强制设置
DataContext = this,会覆盖外层页面传入的ViewModel上下文,即便属性改为支持绑定,也会找不到正确的数据源。
修复方案
步骤1:将TextToDisplay改为依赖属性
替换用户控件后台的属性定义,代码如下:
public partial class MenuItemUserControl : UserControl { // 注册TextToDisplay依赖属性 public static readonly DependencyProperty TextToDisplayProperty = DependencyProperty.Register( nameof(TextToDisplay), typeof(string), typeof(MenuItemUserControl), new PropertyMetadata(default(string))); public string TextToDisplay { get => (string)GetValue(TextToDisplayProperty); set => SetValue(TextToDisplayProperty, value); } public MenuItemUserControl() { InitializeComponent(); // 删掉原来的 DataContext = this; 代码 } }
步骤2:调整用户控件内部绑定逻辑
修改用户控件XAML中TextBlock的绑定,指定源为当前控件本身,不需要依赖全局DataContext:
<TextBlock d:Text="sample" Text="{Binding TextToDisplay, Mode=OneWay, RelativeSource={RelativeSource AncestorType=UserControl}}" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="{StaticResource MenuItems}"/>
修改完成后外层页面的绑定代码不需要改动,运行即可正常加载ViewModel中StartStop对应的文本值。
内容的提问来源于stack exchange,提问作者Baddack
相关产品推荐
相关产品推荐

