WPF 绑定表达式路径错误
本文关键字:错误 路径 表达式 绑定 WPF | 更新日期: 2023-09-27 18:36:05
我有模型BaseModel
,字段为Id
,Created
,Deleted
和Name
等。
从这个模型中,我推导出了Category
和Brand
模型。型号Brand
具有现场Image
。
我也有类Node
(标题作为名称和值作为所有对象)
public class Node : INotifyPropertyChanged
{
private string _title;
private BaseModelDto _value;
private bool _isSelected;
#region ctor
public Node(string title, BaseModelDto value)
{
Title = title;
Value = value;
}
#endregion
#region Properties
public string Title
{
get { return _title; }
set
{
_title = value;
NotifyPropertyChanged("Title");
}
}
public BaseModelDto Value
{
get { return _value; }
set
{
_value = value;
NotifyPropertyChanged("Value");
}
}
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
NotifyPropertyChanged("IsSelected");
}
}
#endregion
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
我使用类Node
进行ComboBox
。所以我有类别和品牌的组合框。原因类别和品牌派生自我用于它们的相同类的基本模型Node
在<ComboBox.ItemTemplate>
中,我想显示Image
如果它存在。所以我写了下一段代码:
<Image MaxHeight="30" Margin="15,0,0,0" HorizontalAlignment="Right" Name="ImageCheckBox" Grid.Column="1">
<Image.Style>
<Style TargetType="{x:Type Image}">
<Setter Property="Source" Value="{Binding Value.Image.FileLocation, Converter={StaticResource ImagePathConverter}}" />
</Style>
</Image.Style>
</Image>
它有效,它仅显示Brand
项目的图像,因为只有它们具有Image
。
但是在输出窗口中,我看到下一条消息:
System.Windows.Data 错误: 40 : 绑定表达式路径错误: 在"对象"类别"(哈希代码=56044044)"上找不到"图像"属性。BindingExpression:Path=Value.Image.FileLocation;DataItem='Node' (hashCode=65381042);目标元素是"图像"(名称="图像复选框");目标属性为"源"(类型为"图像源")
正如我之前所读到的,绑定中的任何异常都会对 WPF 应用程序性能产生影响。如何解决此问题?
您可以将ComboBox
的ItemTemplateSelector
设置为如下所示:
public class CategoryBrandItemTemplateSelector : DataTemplateSelector
{
public DataTemplate CategoryItemTemplate { get; set; }
public DataTemplate BrandItemTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if(item is Category)
return CategoryItemTemplate;
if(item is Brand)
return BrandItemTemplate;
return base.SelectTemplate(item, container);
}
}
在 XAML 中:
<ComboBox>
<ComboBox.ItemTemplateSelector>
<local:CategoryBrandItemTemplateSelector BrandItemTemplate="{StaticResource BrandTemplate}"
CategoryItemTemplate="{StaticResource CategoryTemplate}" />
</ComboBox.ItemTemplateSelector>
</ComboBox>
其中BrandTemplate
是在某处声明的DataTemplate
资源(这将与您现在用作ItemTemplate
的资源相同),并且CategoryTemplate
将是没有Image
和失败绑定的资源。