1

MVVM パターンを使用した Windows 8 XAML/C# アプリケーションがあります。

フォーム上のすべてのテキスト ボックスには、テキスト プロパティが MVVM クラスのプロパティにバインドされています。

したがって、私のテキストボックスの1つは次のようになります。

<TextBox x:Name="textAddressLine1" Text="{Binding AddressLine1, Mode=TwoWay}"/>

MVVM クラスのプロパティは次のようになります。

    private string addressLine1;

    public string AddressLine1
    {
        get { return addressLine1; }
        set
        {
            if (addressLine1 == value)
            {
                return;
            }

            addressLine1 = value;
            RaisePropertyChanged("AddressLine1");
        }
    }

テキスト ボックスに入力すると、MVVM クラスが更新されません。フォーカスが別のコントロールに移動したときにのみ更新されます。

テキスト ボックスのテキストが変更されたときに MVVM クラス プロパティを更新するにはどうすればよいですか?

前もって感謝します

4

3 に答える 3

1

私は同じ問題を抱えていました

<TextBox Text="{Binding Path=EmailAddress, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

なので必ず設定

UpdateSourceTrigger=PropertyChanged
デフォルト値は LostFocus です

于 2016-01-12T12:51:42.890 に答える
1

textAddressLine1 に明示的なバインディングを使用する

<TextBox x:Name="textAddressLine1" Text="{Binding AddressLine1,UpdateSourceTrigger=Explicit, Mode=TwoWay}" TextChanged="textAddressLine1_Changed"/>


private void textAddressLine1_Changed(object sender, RoutedEventArgs e)
{  
BindingExpression be = textAddressLine1.GetBindingExpression(TextBox.TextProperty);
be.UpdateTarget();
}

私はコードをテストしませんでしたが、動作するはずです。

編集:環境に UpdateSourceTrigger が存在しないことがわかりました

ビューモデルをインスタンスとして作成し、コード ビハインドからビューモデルを簡単に実行できる方法でデータ コンテキストとして提供できます。このタイプのケースでは、その日を節約できます!

 public MyClassViewModel ViewModel {get;set} 
 ctor()
 {
   this.ViewModel=new MyClassViewModel();
   this.DataContext=this.ViewModel;
   InitializeComponets();
 }

 private void textAddressLine1_Changed(object sender, RoutedEventArgs e)
 {  
   this.ViewModel.AddressLine1=textAddressLine1.Text;
 }

この方法なら双方向はいらないと思います。ワンウェイでOKです。VM を明示的に変更するためです。

注:SOでコーディングしましたが、再度テストしませんでした。

于 2013-04-05T13:43:00.087 に答える