2012-06-29 134 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 

的切換按鈕下面的樣式得到正確的第一個更新的條件,但此後並沒有改變僞代碼。

例如,如果我做了一個不會使vm無效的更改,則顏色正確爲綠色。但是,如果我做出改變以使vm無效,那麼它應該保持綠色,當它應該是紅色時。相反,如果第一次更新使vm無效,則顏色正確設置爲紅色,但是第二次更新糾正了無效錯誤,但使vm變髒並不會將顏色更改爲綠色。

我在做什麼錯?

我還沒有嘗試視覺狀態管理器,但會是一個首選的方式嗎?那看起來怎麼樣?

使用

 <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

而你的VM正在實施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

嘗試設置填充到默認的顏色(綠色)爲(在風格IE)的觸發之外的二傳手