0

私はWPFを使い始めたばかりで、「Sams Teach Yourself WPF」を読んでいます。第 6 章では、以下に示すように、コード ビハインドでプロパティへのバインディングを紹介します。この方法は、私にとって一貫性のない成功を収めています。

私の現在のプロジェクトでは、このメソッドは、値がラベルにバインドされた 2 つの double に対して機能しました。同じメソッドを使用して bool を MenuItem の IsEnabled プロパティにバインドしようとすると、メソッドが失敗します。

次に、本の簡単な例に戻り、プロパティ タイプを String から bool に変更しました。その場合、Bool を Button と TextBox にバインドできました。

このメソッドが失敗すると、OnChanged 関数で EventHandler が常に null になることに気付きました。私は何が欠けていますか?

private String _myString;
public String MyString
{
     get { return _myString; }
     set 
     {   
          _myString = value;
          OnMyStringChanged();
     }
}

public event EventHandler MyStringChanged;

private void OnMyStringChanged()
{
     if (MyStringChanged != null)
          MyStringChanged(this, EventArgs.Empty);
}

MainWindow クラスに次の XAML があります。MainWindow のコンストラクターで、DataContext を MyString を含むクラスの新しいインスタンスに設定します。

<TextBox Text="{Binding Path=MyString, Mode=TwoWay}"
         Margin="4"/>
<Button Grid.Row="1"
        Height="40"
        Margin="4"
        Click="Button_Click"
        Content="{Binding Path=MyString, Mode=TwoWay}"/>
4

2 に答える 2

1

あなたが直面している問題は、フォームのコピーをインスタンス化するコードが "MyStringChanged" イベントにリスナーを登録する必要があることです。

フォームのインスタンスを宣言する場所を確認してください。

var myForm = new TestForm();
TestForm.Show();

次を追加する必要があります。

var myForm = new TestForm();
myForm.MyStringChanged += someHandlingMethod;
TestForm.Show();

そのようなことはサンプルで言及されるべきです。

正直なところ、私が読んだものからの素晴らしいサンプルではありません. 彼らは、WPF を使用して WinForm スタイルのアプリを作成しています。WPF を学習するには、MVVM を調べる必要があります。それは確かに24時間の仕事ではありません。上記のことを行うと、WinForm アプリケーションを構築しているのと同じように、頭痛の種が大幅に軽減されます。

于 2012-09-27T04:05:30.170 に答える
0

問題は私にありました。XAML バインディング パスの変数名のスペルを間違えていました。バインディング パスが無効な場合、コンパイラの警告または例外を受け取ることを期待していました。バインディング モードを「TwoWay」に変更しても、バインディング パスが存在しないという警告や実行時例外は発生しません。お時間を無駄にして申し訳ありません。

于 2012-09-27T11:30:48.603 に答える