1

、、などの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));
        }
    }
}

のクラスを使用NodeComboBoxます。そのため、カテゴリとブランドの 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 パス エラー: 'Image' プロパティが 'object' ''Category' (HashCode=56044044)' に見つかりません。BindingExpression:Path=Value.Image.FileLocation; DataItem='ノード' (HashCode=65381042); ターゲット要素は 'Image' (Name='ImageCheckBox') です。ターゲット プロパティは 'Source' (タイプ 'ImageSource')

前に読んだように、Binding の例外は WPF アプリのパフォーマンスに影響を与える可能性があります。この問題を解決するにはどうすればよいですか?

4

1 に答える 1

0

ItemTemplateSelectorComboBoxを次のように設定できます。

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>

whereBrandTemplateはどこかで宣言されたDataTemplateリソースです (これは、現在 として使用しているものと同じになりますItemTemplate) 。CategoryTemplateImage

于 2016-02-25T21:07:12.157 に答える