ユーザーがTextBoxのテキストを変更していることをViewModelに伝えるにはどうすればよいですか?
質問
つまり、 MVVM アプリケーションがあり、ユーザーに TextBox と入力中に入力してもらいたい、彼が顧客の姓を入力したかどうかを確認したい。
ユーザーが ComboBoxのアイテムを変更したとき:ViewModelに取得する方法は次のとおりです。
<ComboBox
ItemsSource="{Binding Customers}"
ItemTemplate="{StaticResource CustomerComboBoxTemplate}"
Margin="20"
HorizontalAlignment="Left"
SelectedItem="{Binding SelectedCustomer, Mode=TwoWay}"/>
そして、ユーザーがスライダーを移動したときをViewModelに知らせる方法は次のとおりです。
<Slider Minimum="0"
Margin="10"
Width="400"
IsSnapToTickEnabled="True"
Maximum="{Binding HighestCustomerIndex, Mode=TwoWay}"
Value="{Binding SelectedCustomerIndex, Mode=TwoWay}"/>
ここで、ユーザーがTextBoxでテキストを変更し、TextBoxからフォーカスを移動したときにViewModelを取得する方法を次に示します。
<TextBox
Width="200"
Text="{Binding TypedCustomerName}"/>
しかし、ユーザーが入力時に TextBoxのテキストを変更したことをViewModelに取得するにはどうすればよいですか。このようなもの:
擬似コード(TextChangedはイベントであるためエラーが発生します):
<TextBox
Width="200"
TextChanged="{Binding CurrentTextInTextBox}"/>
解決
必要に応じて、TextBoxがフォーカスを失ったときにのみViewModelを更新する代わりに、入力時に更新するように設定できます。テキストバインディングプロパティの UpdateSourceTrigger TextBoxのが、他のほとんどのコントロールのようにPropertyChangedではなく、デフォルトでLostFocusに設定されますが、バインディングで明示的に設定できます。これにより、UIで変更されると、VMまたはMのTypedCustomerNameプロパティが更新されます。
<TextBox
Width="200"
Text="{Binding TypedCustomerName, UpdateSourceTrigger=PropertyChanged}"/>
探しているものではない場合は、 AttachedCommandBehaviors を使用して、TextChangedルーティングイベントをビューモデルに存在するICommandにバインドします。
他のヒント
TextBoxexのデフォルトでは、LostFocusで更新されます。 UpdateSourceTrigger =&quot; PropertyChanged&quot;を設定します。ユーザーが入力しているときに更新します。