10

WPF UIのMV-VMパターンに従っています。コマンドを、TextBox の TextChanged イベントに、ViewModel クラスにあるコマンドに接続したいと考えています。このタスクを完了する唯一の方法は、TextBox コントロールから継承し、ICommandSource を実装することです。その後、コマンドが TextChanged イベントから起動されるように指示できます。これは、非常に単純に見えるものに対して、あまりにも多くの作業を行うように思われます。

TextChanged イベントを ViewModel クラスにフックする (TextBox をサブクラス化し、ICommandSource を実装するよりも) 簡単な方法はありますか?

4

3 に答える 3

18

まず、PropertyChanged の UpdateSourceTrigger を使用して、viewmodel への双方向データ バインディングを検討したことは間違いありません。そうすれば、テキストが変更されるたびに、バインド先のプロパティのプロパティ セッターが呼び出されますか?

それだけでは不十分な場合は、Attached Behaviours を使用してこの問題に取り組みます。Julian Dominguez のブログでは、Silverlight で非常に類似したことを行う方法についての記事を見つけることができます。これは、WPF に簡単に適応できるはずです。

基本的に、(TextBoxBehaviours などと呼ばれる) 静的クラスでは、ICommand 型の (おそらく) TextChangedCommand という添付プロパティを定義します。そのプロパティの OnPropertyChanged ハンドラーをフックし、ハンドラー内で、プロパティが TextBox に設定されていることを確認します。そうである場合は、プロパティで指定されたコマンドを呼び出すテキスト ボックスの TextChanged イベントにハンドラーを追加します。

次に、ビューモデルがビューの DataContext に割り当てられていると仮定すると、次のように使用できます。

<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />
于 2008-09-11T09:51:56.537 に答える
8

イベントバインディングとコマンドメソッドを使用することは、使用するのに適切ではない場合があります。このコマンドは正確に何をしますか?

VMの文字列フィールドへのデータバインディングの使用を検討することをお勧めします。このようにして、UIをまったく気にすることなく、そこからコマンドまたは関数を呼び出すことができます。

<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}
于 2008-09-11T10:07:31.570 に答える
2

TextChanged イベントを処理して、そこからコマンドを実行することはできませんか?

private void _textBox_TextChanged(object sender, EventArgs e)
{
    MyCommand.Execute(null);
}

あなたが言うように、別の方法はTextBox、コマンド ソースとして機能する を作成することですが、多くの場所で共有して活用することを計画していない限り、それはやり過ぎのように思えます。

于 2008-09-11T08:58:41.140 に答える