【发布时间】:2012-07-01 01:59:53
【问题描述】:
这是我想做的伪代码
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>
【问题讨论】:
-
您的虚拟机正在实施 INPC?
-
@LPL。是的,当然但是我引入了一个错误,该错误阻止了 IsValid 上的通知!你会布置相同的触发器吗?您对 VSM 的使用有任何见解吗?请回答一下,这样下一个傻瓜可能会先回去检查显而易见的事情。
标签: wpf mvvm triggers visualstatemanager multidatatrigger