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をダーティのままにする2番目の更新では、色は緑に変更されません。

私は何が間違っているのですか?

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

2 に答える 2

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>
于 2012-06-29T15:13:39.700 に答える
1

トリガーの外側(つまりスタイル内)のセッターとして塗りつぶしをデフォルトの色(緑)に設定しようとしています

于 2012-06-29T14:52:33.073 に答える