2009-07-11 10 views
0

バインディングと値を共有する.xamlファイルと.csファイルがあります。WPF値の更新に関するバインドの問題

シンプルにするために、私は1つのボタンと1つのテキストボックスを持っています。テキストボックスのテキストに文字がない場合、ボタンを無効にしたいここで

は、結合のためのXAMLの2つのコードです:

<TextBox Name="txtSend" Text="{Binding Path=CurrentText,UpdateSourceTrigger=PropertyChanged}"></TextBox> 
    <Button IsEnabled="{Binding Path=IsTextValid}" Name="btnSend">Send</Button> 

ようなの.csファイルを見に2つのプロパティ:

public string CurrentText 
    { 
     get 
     { 
      return this.currentText; 
     } 
     set 
     { 
      this.currentText = value; 
      this.PropertyChange("CurrentText"); 
      this.PropertyChange("IsTextValid"); 
     } 
    } 

    public bool IsTextValid 
    { 
     get 
     { 
      return this.CurrentText.Length > 0; 
     } 
    } 

this.PropertyChangedは、単にPropertyChangedを呼び出す方法であり、 INotifyPropertyChangedから取得します。

問題は、現在のテキストのセッターでthis.PropertyChange("IsTextValid");を呼び出してボタンの状態を変更できることです。

質問1)ルールを複雑にすると、多くのPropertyChangedを呼び出す必要があるかもしれません...

質問2)フォームの読み込み時にマイボタンが有効になります。最初からメソッドをチェックするにはどうしたらいいですか?

答えて

2

質問1:これは正しいです。それをすることは問題ありません。ただし、IDataErrorInfoを使用して検証を行うことができます。 (Googleが検索して、良い例がたくさんあります)

質問2: "currentText"文字列がstring.emptyで初期化されていることを確認してください。初期化していないと、nullになり、IsTextValidのゲッターが例外をスローし、WPFが値を取得できなくなるためです。

またはそのようなことを行います。それを行うの

public bool IsTextValid 
{ 
    get 
    { 
     return ! string.IsNullOrEmpty(this.CurrentText); 
    } 
} 
+0

+1と回答が受け入れられました:+25担当者があなたのために私の友人です。ありがとうございました。 –

0

あなたの方法は正しいです。あなたが少し怠けているなら(私のように)、NuGetパッケージのFody.PropertyChangedを見てください。

あなたのコードは

public string CurrentText { get; set; } 

public bool IsTextValid { get { return this.CurrentText.Length > 0; } } 

Fody.PropertyChangedはあなたのための残りを行いに簡素化します。 CurrentTextが変更されたことを通知するために必要な指示が自動的に追加され、に依存していることも検出され、通知されます。

関連する問題