Триггер WPF не будет устанавливать свойство, если установлено в элементе - PullRequest
10 голосов
/ 19 августа 2011

Такое поведение кажется мне невероятно странным, и я предполагаю, что делаю что-то не так, чтобы понять это.У меня есть ContentControl, который использует DataTemplete для визуализации TabControl.Я хочу, чтобы изображение отображалось при отсутствии открытых вкладок и скрывалось при его наличии.Но вот проблема:

<Image Name="image1" Stretch="Uniform" Visibility="Hidden" Source="/Affinity;component/Images/affinity_logo.png">
            <Image.Style>
                <Style TargetType="Image">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}"
                        Value="0">
                            <Setter Property="Visibility" Value="Visible" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>

Это не работает ... вроде.

Я проверил это на Visiblity и Margin (просто чтобы убедиться).Этот триггер изменит свойство, если только это свойство не определено в тегах Image.Если это так, триггер не будет обновлять это свойство.Итак, если я не определяю видимость изображения, а триггер скрывает его, это работает.Проблема в том, что по умолчанию используется Visible, и триггер должен показывать его, когда значение = 0, и скрывать его в противном случае.

Почему триггер не отменяет свойства, которые явно определены?Разве это не его цель?

Ответы [ 3 ]

20 голосов
/ 19 августа 2011

Это нормальное Значение свойства зависимости Приоритет .Для параметра Image установлено значение # 3, а для триггера Style - более низкий приоритет # 6.

Вместо этого можно сделать следующее:

<Image Name="image1" Stretch="Uniform" Source="/Affinity;component/Images/affinity_logo.png">
    <Image.Style>
        <Style TargetType="Image">
            <Setter Property="Visibility" Value="Hidden" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Items.Count, ElementName=tabcontrolworkspaces}"
                    Value="0">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Image.Style>
</Image>
6 голосов
/ 19 августа 2011

Установите видимость в стиле в дополнение к триггеру.

Я неоднократно сталкивался с этим странным поведением с DataTriggers, когда иногда DataTrigger Setters не действует, если Setter также не определен вСтиль.

Не будет работать

<Image Visibility="Collapsed">
    <Image.Style>
        <Style TargetType="Image">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Something}" Value="0">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    <Image.Style>
</Image>

Будет работать

<Image>
    <Image.Style>
        <Style TargetType="Image">
            <Setter Property="Visibility" Value="Collapsed" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Something}" Value="0">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    <Image.Style>
</Image>

Редактировать: См. принятый ответ для объяснения, почему это не работает.Это связано с порядком, в котором определяются свойства зависимостей, где свойства, определенные в <Tag>, всегда имеют приоритет над инициируемыми значениями.

0 голосов
/ 19 августа 2011

Когда триггер имеет значение true, он изменяет значение на желаемое значение. Когда оно больше не истинно, оно возвращает значение к предыдущему значению. Он не изменит его на значение, которого он не хочет.

Это означает, что если исходное значение является видимым, а вы изменяете его на видимое, когда триггер больше не активен, значение возвращается к видимому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...