替换 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
绑定到 ListView
的 Tag
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}"/>
在我的 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
绑定到 ListView
的 Tag
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}"/>