项模板中的 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(;目标元素是"文本块"(名称="(;目标属性为"文本"(类型"字符串"(
这告诉我,在某些时候,项模板中TextBlock
的DataContext
被视为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);
}
}
}
在这里放置一个断点,我可以看到TextBlock
的DataContext
确实是一个Catalogue
,并且代码按预期工作。
为什么会出现此明显的错误消息?我应该担心它,这是否意味着我在代码中犯了一些阴险的错误,或者我应该满足于代码工作?如果这是一个无关紧要或愚蠢的问题,我深表歉意,但我只是在学习 WPF,我发现它非常具有挑战性,所以我试图了解我周围发生的事情,即使我的代码碰巧有效。非常感谢您的见解。
违规行是 Content=" "
。您正在将控件的内容设置为" "
字符串,控件会尝试将模板应用于该字符串。由于类没有Id
属性string
因此会导致绑定错误。