ItemTemplate中的WPF绑定有效但会产生错误消息

时间:2016-10-02 10:25:13

标签: c# wpf binding itemtemplate itemssource

我在项目的Mahapps.Metro.Controls.DropDownButton中使用UserControl,我使用数据绑定填充。为了知道哪个项目被选中,我应用了一个项目模板,我在其中指定了项目点击处理程序。相关的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属性是实现KeyedCollection<string, Catalogue>的自定义INotifyCollectionChanged。这包含的元素类似于实现KeyedCollection的自定义INotifyCollectionChanged对象,但项目类型为Question,不再是集合。 Catalogue个对象具有只读属性Id,我将TextBlock绑定到项目模板中。

绑定似乎可行,DropDownButton会填充Id集合中Catalogue个对象的Catalogues个标签,但我会收到输出通知我有一个绑定错误:

  

System.Windows.Data错误:40:BindingExpression路径错误:&#39; Id&#39;在&#39; object&#39;上找不到的属性&#39;&#39;字符串&#39; (的HashCode = -842352768)&#39 ;. BindingExpression:路径=标识;的DataItem =&#39;字符串&#39; (的HashCode = -842352768);目标元素是&#39; TextBlock&#39; (名称=&#39;&#39);目标属性是&#39; Text&#39; (键入&#39; String&#39;)

这告诉我,在某些时候,项目模板中DataContext的{​​{1}}被视为TextBlock,但我打算将其作为String集合中的项目绑定到Catalogue。这不仅是证实这一概念的正确操作,也是我ItemsSource事件处理程序的正确操作:

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); } } } 的{​​{1}}确实是DataContext,代码按预期工作。

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

1 个答案:

答案 0 :(得分:1)

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