ユーザーがTextBoxのテキストを変更していることをViewModelに伝えるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1013208

  •  06-07-2019
  •  | 
  •  

質問

つまり、 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;を設定します。ユーザーが入力しているときに更新します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top