WPF: Не срабатывает DataTrigger из-за неправильно указанного сеттера

  1. Имеется изображение с заранее заданным источником
  2. Данный источник через дататриггер должен меняться, основываясь на значении свойства Tag листбокса
  3. Вероятность того, что свойство Tag пусто или имеет не то значение, которое нужно, отсутствует
<ListBox Name="someListBox"/>
<Image Source="/Folder/SubFolder/firstImage.png">
    <Image.Style>
        <Style TargetType="Image">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=someListBox, Path=Tag}" Value="Physical">
                    <Setter Property="Source" Value="/Folder/SubFolder/secondImage.png"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>

Однако изображение не меняется, то есть, триггер не указывает неправильный путь, а именно что не работает, в связи с чем для проверки я создал совершенно идентичный, за исключением TargetType и Property, дататриггер для текстблока, и он сработал:

<TextBlock>
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=someListBox, Path=Tag}" Value="Physical">
                    <Setter Property="Text" Value="/Folder/SubFolder/secondImage.png"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

...из-за чего я определенно уверен, что проблема кроется в Property в этой строке:

<Setter Property="Source" Value="/Folder/SubFolder/secondImage.png"/>

Собственно, а в чем подвох?


Ответы (2 шт):

Автор решения: Pavel Popov

Так работает

<ListBox Name="someListBox">
            <Button Content="First" Tag="First"/>
            <Button Content="Physical" Tag="Physical"/>
        </ListBox>
        <Image>
            <Image.Style>
                <Style TargetType="{x:Type Image}">
                    <Setter Property="Source" Value="Folder/SubFolder/firstImage.png"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=SelectedItem.Tag, ElementName=someListBox }"
                                     Value="Physical">
                            <Setter Property="Source" Value="Folder/SubFolder/secondImage.png"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>
→ Ссылка
Автор решения: aepot

Можно использовать привязку к коллекции, и реагировать сразу на выбранный элемент коллекции.

Вот код-бихайнд

public partial class MainWindow : Window
{
    public ObservableCollection<string> Items { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
        Items = new ObservableCollection<string>();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        Items.Add("Шрек");
        Items.Add("Снеговик");
    }   
}

Вот разметка

<Window x:Class="WpfApp3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp3"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListBox ItemsSource="{Binding Items}" Margin="5" IsSynchronizedWithCurrentItem="True" VerticalAlignment="Top" />
        <Image Grid.Column="1" Margin="5">
            <Image.Style>
                <Style TargetType="Image">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Items/}" Value="Шрек">
                            <Setter Property="Source" Value="C:\Source\WpfApp3\WpfApp3\bin\Debug\pic1.jpg"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Items/}" Value="Снеговик">
                            <Setter Property="Source" Value="C:\Source\WpfApp3\WpfApp3\bin\Debug\pic2.jpg"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>
    </Grid>
</Window>

введите сюда описание изображения

→ Ссылка