Заменить часть ItemContainerTemplate - PullRequest
       24

Заменить часть ItemContainerTemplate

0 голосов
/ 19 сентября 2018

В моем приложении WPF у меня есть несколько ListViews, которые имеют похожий вид в отношении ItemContainerTemplate: у каждого элемента в списке будет маленькое изображение и текст (имя).Указанное изображение зависит от привязки к нижележащему объекту: если изображение установлено в соответствующем свойстве, то отображается изображение объекта.Если базовый объект не имеет установленного изображения, отображается изображение по умолчанию.В зависимости от ListView изображение по умолчанию может быть разным: для списка статей отображается изображение default-article-image, а для списка клиентов - изображение default-customer-image.

Для всех ListView в моемПриложение ItemContainerTemplate в основном такое же, за исключением изображения по умолчанию.Было бы хорошо, если бы я мог использовать один общий ItemContainerTemplate для всех ListViews, но как я могу заменить изображение по умолчанию для каждого 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, но изменить «StaticResource Article» для каждого?

1 Ответ

0 голосов
/ 20 сентября 2018

Вы можете связать Image.Source с Tag Property (или Присоединенное свойство ) ListView, чтобы установить его индивидуально.

Для привязки к Tag Property в вашем ItemContainerTemplate измените Source на этот

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

И теперь Image.Source можно установить снаружи '

<ListView ItemTemplate="{DynamicResource MyContainerTemplate}" Tag="{StaticResource Article}"/>

Редактировать

Немного менее хакерским способом было бы использовать пользовательский Listview с Property только для установки значения по умолчанию 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}"/>
...