替换 ItemContainerTemplate 的一部分

Relace part of ItemContainerTemplate

在我的 WPF 应用程序中,我有几个 ListView,它们在 ItemContainerTemplate 方面都具有相似的外观:列表中的每个项目都有一个小图像和一个文本(名称)。 所述图像取决于与底层对象的绑定:如果在相应的 属性 中设置图像,则显示对象的图像。如果底层对象没有图像集,则显示默认图像。 根据 ListView,默认图像不同:对于文章列表,显示默认文章图像,但对于客户列表,显示默认客户图像。

对于我的应用程序中的所有 ListView,ItemContainerTemplate 基本相同,除了默认图像。如果我可以为所有 ListView 使用一个通用的 ItemContainerTemplate 就好了,但是我如何才能为每个 ListView 替换默认图像。

我当前的 ItemContainerTemplate 基本上是这样的:

<ItemContainerTemplate x:Key="MyContainerTemplate">
.
.
.
<Image>
 <Image.Style>
  <Style>
   <Setter Property="Image.Source" Value="{Binding Image}" />
   <Style.Triggers>
    <DataTrigger Binding="{Binding Image}" Value="{x:Null}">
     <Setter Property="Image.Source" Value="{StaticResource Article}" />
    </DataTrigger>
   </Style.Triggers>
  </Style>
 </Image.Style>
</Image>
.
.
.
</ItemContainerTemplate>

如何将此 ItemContainerTemplate 用于所有 ListView,但要为每个 ListView 更改 'StaticResource Article'?

您可以将 Image.Source 绑定到 ListViewTag Property(或 Attached Property)以单独设置。

要绑定到 ItemContainerTemplate 中的 Tag Property,请将来源更改为此

<Setter Property="Image.Source" Value="{Binding Path=Tag, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}"/>

现在可以从 'outside'

设置 Image.Source
<ListView ItemTemplate="{DynamicResource MyContainerTemplate}" Tag="{StaticResource Article}"/>

编辑

一种不那么棘手的方法是使用带有 Property 的自定义 Listview,仅用于设置默认 Image 源。

自定义 ListView 可能看起来像这样并放置在 Your.Namespace.

public class ListViewWithDefaultImage : ListView
{
    public ListViewWithDefaultImage() : base() { }
    public string DefaultImageSource
    {
        get { return (string)this.GetValue(DefaultImageSourceProperty); }
        set { this.SetValue(DefaultImageSourceProperty, value); }
    }

    public static readonly DependencyProperty DefaultImageSourceProperty = DependencyProperty.Register("DefaultImageSource", typeof(string), typeof(ListViewWithDefaultImage), new PropertyMetadata(String.Empty));
    //Note: its possible to replace String.Empty with a default Path for Default Images
}

此外,样式必须绑定到 DefaultImageSource Property

<Setter Property="Image.Source" Value="{Binding Path=DefaultImageSource, RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" />

现在可以这样用了

xmlns:cc="clr-namespace:Your.Namespace"
.
.
<cc:ListViewWithDefaultImage ItemsSource="{Binding Samples}" ItemTemplate="{DynamicResource MyContainerTemplate}" DefaultImageSource="{StaticResource Article}"/>