我的模型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
。所以我有分类和品牌的ComboBox。原因类别和品牌是从BaseModel派生出来的,我使用的是同一个类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:BindingExpression路径错误:'对象'''类别'(HashCode = 56044044)'上找不到'图像'属性。 BindingExpression:路径= Value.Image.FileLocation; DataItem ='Node'(HashCode = 65381042); target元素是'Image'(Name ='ImageCheckBox'); target属性是'Source'(类型'ImageSource')
正如我之前读到的,Binding中的任何异常都会影响WPF App的性能。我该如何解决这个问题?
答案 0 :(得分:0)
您可以将ItemTemplateSelector
的{{1}}设置为以下内容:
ComboBox
在XAML中:
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);
}
}
其中<ComboBox>
<ComboBox.ItemTemplateSelector>
<local:CategoryBrandItemTemplateSelector BrandItemTemplate="{StaticResource BrandTemplate}"
CategoryItemTemplate="{StaticResource CategoryTemplate}" />
</ComboBox.ItemTemplateSelector>
</ComboBox>
是在某处声明的BrandTemplate
资源(这与您现在用作DataTemplate
的资源相同),而ItemTemplate
将是没有资源的CategoryTemplate
Image
和失败的绑定。