我在项目的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而且我发现它非常具有挑战性,所以即使我的代码工作正常,我也会试着去理解我周围发生的事情。非常感谢您的见解。
答案 0 :(得分:1)
违规行为Content=" "
。您正在将控件的内容设置为" "
字符串,控件会尝试应用您的模板。由于string
类没有Id
属性,因此会导致绑定错误。