2012-06-29 3 views
0

Вот код для псевдо то, что я хочу сделатьТриггеры не обновляя

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> 
+1

И ваша виртуальная машина внедряет INPC? – LPL

+0

@ LPL. Да, конечно, НО я ввел ошибку, которая предотвращала уведомление об IsValid от стрельбы !! Вы бы оставили триггеры такими же? У вас есть понимание использования VSM? Пожалуйста, сделайте ответ, чтобы следующий дурак мог вернуться и сначала проверить очевидность. – Berryl

ответ

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> 
1

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