0

ボタンがあり、ビュー モデルに BooleanSwitch というブール プロパティがあります。

ボタンのテキストと前景色を次のいずれかにする必要があります。

  • 緑オン、BooleanSwitch が true の場合
  • 赤 OFF、BooleanSwitch が false の場合

そして、値が変化したときに動的に変化させたいです。

もちろん、コードビハインドで実行できます。しかし、これに対する XAML ソリューションはありますか? 私は次のことを試しました:

<Style x:Key="SwitchButtonStyle" TargetType="Button">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=BooleanSwitch}" Value="true">
            <Setter Property="Foreground" Value="Red"/>
            <Setter Property="Content" Value="ON"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=BooleanSwitch}" Value="false">
            <Setter Property="Foreground" Value="#00AA00" />
            <Setter Property="Content" Value="OFF"/>
        </DataTrigger>
    </Style.Triggers>
</Style>


<Button Click="button_Click" Style="{DynamicResource SwitchButtonStyle}" />

クリック方法は次のとおりです。

private void button_Click(object sender, RoutedEventArgs e)
{
    BooleanSwitch = !BooleanSwitch;
}

BooleanSwitch のコードは非常に単純です (.NET 4.5):

    private bool privateBooleanSwitch;
    public bool BooleanSwitch
    {
        get { return privateBooleanSwitch; }
        set
        {
            if (value == privateBooleanSwitch)
                return;

            privateBooleanSwitch= value;
            OnPropertyChanged();
        }
    }

読み込まれると、トリガーがアクティブになり、ボタンが で赤くなりますが、ボタンをクリックすると機能しなくなります...そして、DataTriggers がどのように機能するかをよく理解していないことがわかります。

私は何を間違っていますか?

ボタンは単一目的のボタンですが、特定の要素内で DataTrigger を使用できないことが既にわかっています。テキストと色を含む別のプロパティを作成し、それらをボタンのプロパティにバインドすることを考えていましたが、それは不要なコード調整のように思えます。色とテキストの定義には XAML を使用したいと思います。

4

1 に答える 1

1

自分。

バカ。

何だと思う。

public abstract class ViewModelBase
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

実際にインターフェイスINotifyPropertyChangedを実装しましたが、クラス定義で言及するのを忘れていました。

public abstract class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

ここで間違いを探すのではなく、WPF トリガーの理解に間違いがあるに違いないと確信していました。LPLに感謝します。

于 2012-12-13T16:30:09.183 に答える