Триггеры не обновляются
Вот код 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>
Попытка установить заливку на цвет по умолчанию (зеленый) как установщик вне триггера (то есть в стиле)