项模板中的 WPF 绑定有效,但会产生错误消息

本文关键字:消息 错误 有效 绑定 WPF | 更新日期: 2023-09-27 18:09:57

我在项目中的UserControl中使用Mahapps.Metro.Controls.DropDownButton,我使用数据绑定填充该项目。为了知道选择了哪个项目,我应用了一个项目模板,在其中指定了项目单击处理程序。相关的 XAML 是

<Controls:DropDownButton
    x:Name="selector"
    VerticalContentAlignment="Center"
    Content=" "
    Background="Transparent"
    BorderThickness="0"
    ItemsSource="{Binding Catalogues}"
>
   <Controls:DropDownButton.ItemTemplate>
      <DataTemplate>
         <TextBlock Text="{Binding Id}" MouseDown="HandleDropDownItemMouseDown" />
      </DataTemplate>
   </Controls:DropDownButton.ItemTemplate>
</Controls:DropDownButton>

DataContext是在用户控件的代码隐藏的构造函数中设置的自定义视图模型:

public CatalogueEditor()
{
        InitializeComponent();
        this.viewModel = new CatalogueEditorViewModel();
        this.DataContext = this.viewModel;
}

视图模型中的 Catalogues 属性是实现INotifyCollectionChanged的自定义KeyedCollection<string, Catalogue>。它包含的元素是实现INotifyCollectionChanged的类似自定义KeyedCollection对象,但项目类型为 Question ,它不再是一个集合。 Catalogue对象都有一个只读属性Id,我将项模板中的TextBlock绑定到该属性。

绑定似乎工作正常,并且DropDownButton填充了 Catalogues 集合中 Catalogue 对象的Id标签,但我得到一个输出,通知我绑定错误:

System.Windows.Data 错误: 40 : 绑定表达式路径错误: 在"对象"字符串"(哈希代码=-842352768("上找不到"Id"属性。绑定表达式:路径=Id;DataItem='string' (hashCode=-842352768(;目标元素是"文本块"(名称="(;目标属性为"文本"(类型"字符串"(

这告诉我,在某些时候,项模板中TextBlockDataContext被视为String,尽管我打算将其作为绑定到ItemsSource的集合中的项Catalogue。不仅正确的操作证实了这个概念,而且我的HandleDropDownItemMouseDown事件处理程序也证实了这一点:

void HandleDropDownItemMouseDown(object sender, MouseButtonEventArgs e)
{
        if (e.ChangedButton == MouseButton.Left && selector.IsExpanded) {
            Catalogue catalogue = ((TextBlock)e.Source).DataContext as Catalogue;
            if (catalogue != null) {
                viewModel.Select(catalogue);
            }
        }
}

在这里放置一个断点,我可以看到TextBlockDataContext确实是一个Catalogue,并且代码按预期工作。

为什么会出现此明显的错误消息?我应该担心它,这是否意味着我在代码中犯了一些阴险的错误,或者我应该满足于代码工作?如果这是一个无关紧要或愚蠢的问题,我深表歉意,但我只是在学习 WPF,我发现它非常具有挑战性,所以我试图了解我周围发生的事情,即使我的代码碰巧有效。非常感谢您的见解。

项模板中的 WPF 绑定有效,但会产生错误消息

违规行是 Content=" " 。您正在将控件的内容设置为" "字符串,控件会尝试将模板应用于该字符串。由于类没有Id属性string因此会导致绑定错误。