Триггеры не обновляются

Вот код psuedo для того, что я хочу сделать

IF NOT ISDIRTY
    THEN VISIBILITY EQ VISIBILITY.COLLAPSED

IF ISDIRTY AND ISVALID        
    THEN VISIBILITY EQ VISIBILITY.VISIBLE AND COLOR = GREEN

IF ISDIRTY AND NOT ISVALID        
    THEN VISIBILITY EQ VISIBILITY.VISIBLE AND COLOR = RED

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

Например, если я внесу изменение, которое не сделает VM недействительным, цвет будет правильно зеленый. Но если я внесу изменения, чтобы сделать VM недействительным, он останется зеленым, когда он должен быть красным. И наоборот, если первое обновление делает vm недействительным, цвет правильно устанавливается на красный, но второе обновление, которое исправляет недопустимую ошибку, но оставляет vm грязным, не меняет цвет на зеленый.

Что я делаю неправильно?

Я еще не пробовал Visual State Manager, но будет ли это предпочтительным способом? Как это может выглядеть?

использование

        <Ellipse Style="{StaticResource EditedStateIndicatorStyle}"/>

стиль

<Style x:Key="EditedStateIndicatorStyle" TargetType="{x:Type Ellipse}">
    <Setter Property="Width" Value="8" />
    <Setter Property="Height" Value="8" />
    <Setter Property="Margin" Value="8,0"/>
    <Setter Property="SnapsToDevicePixels" Value="false" />
    <Setter Property="Focusable" Value="False" />

    <Style.Triggers>

        <!-- Dirty, && NOT Valid -->
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding IsDirty}" Value="true"/>
                <Condition Binding="{Binding IsValid}" Value="false"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Fill" Value="Red"/>
            <Setter Property="ToolTip" Value="You got errors, fool!"/>
        </MultiDataTrigger>

        <!-- Dirty, but Valid -->
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding IsDirty}" Value="true"/>
                <Condition Binding="{Binding IsValid}" Value="true"/>
            </MultiDataTrigger.Conditions>
            <Setter Property="Fill" Value="Green"/>
            <Setter Property="ToolTip" Value="You made changes!"/>
        </MultiDataTrigger>

        <!-- Not Dirty, don't show anything -->
        <DataTrigger Binding="{Binding IsDirty}" Value="false">
            <Setter Property="Visibility" Value="Collapsed"/>
        </DataTrigger>
    </Style.Triggers>

</Style>

2 ответа

Решение

Если ваша ViewModel реализует INotifyPropertyChanged Сначала убедитесь, что он правильно поднимает событие. Сказал, что я рекомендую упрощение:

<Style TargetType="{x:Type Ellipse}">
    ...
    <Setter Property="Fill" Value="Green" />
    <Setter Property="ToolTip" Value="You made changes!" />

    <Style.Triggers>
        <!-- Dirty, but NOT Valid -->
        <DataTrigger Binding="{Binding IsValid}" Value="false">
            <Setter Property="Fill" Value="Red" />
            <Setter Property="ToolTip" Value="You got errors, fool!" />
        </DataTrigger>

        <!-- Not Dirty, don't show anything -->
        <DataTrigger Binding="{Binding IsDirty}" Value="false">
            <Setter Property="Visibility" Value="Collapsed"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

Попытка установить заливку на цвет по умолчанию (зеленый) как установщик вне триггера (то есть в стиле)

Другие вопросы по тегам