WPF 绑定表达式路径错误



我有模型BaseModel,字段为IdCreatedDeletedName等。

从这个模型中,我推导出了CategoryBrand模型。型号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 应用程序性能产生影响。如何解决此问题?

您可以将ComboBoxItemTemplateSelector设置为如下所示:

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和失败绑定的资源。

相关内容

最新更新