1

私の WPF アプリケーションには、TextBox と Button があります。ボタンには、テキストに対して何かを行うコマンドにバインドされたコマンドがあります。

<TextBox x:Name="_textBox"></TextBox>
<Button Command="{Binding SomeCommand}" 
        CommandParameter="{Binding ElementName=_text, Path=Text}"
        Content="Trigger SomeCommand" />

ここで、ボタンをクリックして TextBox もクリアするアクションが必要です。これを行う最善の方法は何ですか?2 つのオプションが表示されます。

Button にも Click イベントを追加して、テキストを明確にすることができます。これは、アクションが正しく実行される順序に依存して、アクションを 2 つの場所に分割することになるため、私には良い考えのようには思えません。

ここで使用したオプションは、TextBox.Text プロパティの代わりに TextBox 全体を渡すことです。そうすることで、コマンドは最初にテキストを取得して使用し、次に TextBox をクリアできます。私のバインディングは同じですが、「パス」はありません:

<TextBox x:Name="_textBox"></TextBox>
<Button Command="{Binding SomeCommand}" 
        CommandParameter="{Binding ElementName=_text}"
        Content="Trigger SomeCommand" />

そして、私のコマンドの重要な部分:

public class SomeCommand : ICommand
{
    ....
    public void Execute(object parameter)
        var textBox = parameter as TextBox;
        if (inputTextBox == null) return; 
        DoSomething(textBox.Text); 
        textBox.Clear();
    }
}

これに関する私の問題は、コマンドが UI コンポーネントに依存するようになったことと、UI がコマンドに実際に変更を加えることに依存していることです。私はこれに満足しているわけではありません。より良い方法はありますか?

4

1 に答える 1

2

コマンドの実装本体から利用可能なプロパティに Textbox テキストをバインドすることを検討してください。この境界を作成すると、ViewModel から簡単にクリアできます。

例 (XAML):

<TextBox x:Name="_textBox" Text={Binding Path=XYZ}></TextBox>
<Button Command="{Binding SomeCommand}"
        Content="Trigger SomeCommand" />

例 (C#):

    public class SomeCommand : ICommand
    {
        ....

         public void Execute(object parameter)
         {
            //...actions...
            MyViewModelinstance.XYZ = String.Empty;
        }
    }

うまくいったら声かけてください。

編集: MVVM デザイン パターンを使用しているため、明らかなはずですが、念のため、XYZ を変更した後、このプロパティが変更されたことを UI に通知する必要があることを思い出します。たとえば、VM で INotifyPropertyChanged インターフェイスを実装することで実行できます。

于 2010-02-08T13:15:04.763 に答える