0

1つのブール値を設定するだけでコード内の複数のテキストボックスのIsEnabledプロパティを制御したいWPFアプリがあります。そこで、テキストボックスのIsEnabledプロパティにデータバインディングを追加することにしました。ソースオブジェクトの定義は次のとおりです。

<Window.Resources>
     <src:QuestionControlsState x:Key="QuestionContorlsState" IsEnabled="True"/>
</Window.Resources>

ここで、'QuestionControlsState'パブリックプロパティが1つしかない単純なクラス'IsEnabled'次に、いくつかのテキストボックスをバインドします。

<TextBox Name="textBoxQuestion" 
                IsEnabled="{Binding Path=IsEnabled, Source={StaticResource QuestionContorlsState}}">

この時点で、Window.ResourcesセクションのIsEnabled属性を変更すると、データバインディングが機能します。しかし、私はそれをコードから制御したいので、ソースオブジェクトを取得します:

 QuestionControlsState _questionControlsState = (QuestionControlsState)this.FindResource("QuestionContorlsState");

そして、_questionControlsState.IsEnabledを設定しようとすると、テキストボックスの状態が変更されず、出力に警告が表示されるようになりました。

4

4 に答える 4

2

あなたのコードを見ずに、あなたのQuestionControlsStateクラスはINotifyPropertyChangedを実装していないと思います。

次のように変更します。

public class QuestionControlsState : INotifyPropertyChanged
{
    private bool isEnabled = true;
    public bool IsEnabled
    {
        get { return isEnabled; }
        set
        {
            isEnabled = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("IsEnabled"));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

これにより、プロパティを変更するたびにPropertyChangedイベントがトリガーさIsEnabledれ、ビューを更新する必要があることが通知されます。

もちろん、MVVMパターンを使用している場合、これを行う正しい方法は、すべてのテキストボックスをViewModelのブールIsEnabledプロパティにバインドすることであり、コードビハインドで静的リソースを見つけようとすることではありませんIsEnabled = false。 VMはすべてのテキストボックスを無効にします(静的リソースは必要ありません)

于 2013-01-14T14:05:09.740 に答える
1

MVVMパターンを使用して、XAMLビューにデータを渡し、ビューロジックをカプセル化し、ビューロジックをテスト可能にします。

MVVMを使用すると、コントロールのIsEnabledプロパティにバインドできる監視可能なプロパティを非常に簡単に作成できます。プロパティを有効または無効にするには、コマンドを使用してプロパティをtrueまたはfalseに変更するだけです。

于 2013-01-14T14:00:57.900 に答える
0

皆さん、ありがとうございます。Blachshmaは正しかったのですが、カスタムクラスにINotifyPropertyChangedインターフェイスを実装するのを忘れていましたが、今では正常に機能しています。ありがとうございました!MVVMパターンについて考えてみると、見た目はかっこいいですが、WPFから始めたばかりで、基本を学びたいと思っています。

于 2013-01-14T14:13:34.410 に答える
-2

に変更StaticResourceしてみてくださいDynamicResource

ここで情報を見つけることができます

于 2013-01-14T13:58:40.073 に答える