3

私はMVVMアプリに取り組んでおり、多くのネットワークパラメーター(IP、SubnetMaskなど)を変更するために使用されるビューを持っています。

ビューには、次のプロパティにバインドされた多数のテキスト ボックスが含まれていますNetworkConfigViewModel

<TextBox>
    <TextBox.Text>
        <Binding Path="IP" UpdateSourceTrigger="PropertyChanged"/>
    </TextBox.Text>
</TextBox>

... etc

ビューには、 というボタンも含まれていますSave Configuration。このボタンは、ViewModel の RelayCommand にバインドされ、要求に応じて構成をリモート デバイスに保存します。

UpdateSourceTrigger="Explicit"値が変更されたときに更新するのではなく、ユーザーが明示的に「構成の保存」をクリックしたときにのみViewModelが更新されるように、使用するテキストボックスバインディングを変更したいと思います。

BindingExpression.UpdateSource()テキスト ボックスごとに呼び出す必要があることは理解しています。MVVM に適した方法でこれを行うにはどうすればよいですか? UI 要素を認識している ViewModel に新しい RelayCommand を追加することは正しくないようです。

4

3 に答える 3

1

それで、あなたの例に戻って参照してください:

ViewModelに、そのようにモデルのプロパティを公開する代わりに、そのプロパティのプライベートバッキングフィールドがある場合-

private string _myProperty;

public string MyProperty
{

    get { return _myProperty; }
    set
    {
        if (_myProperty != value)
        {
            _myProperty = value;
            OnPropertyChanged("MyProperty");
        }
    }
}

ビューのコントロールは何にバインドされますか?プライベートバッキングフィールドのみを公開するプロパティにバインドする場合、どのようなデータがビューに入るのでしょうか。たとえば、TextBoxはModel.MyPropertyを公開していないため、ViewModelプロパティのMyPropertyにバインドできなくなりました。単に_myPropertyを公開しているだけです。ビューでそのようにModel.MyPropertyにバインドする場合:

<TextBox Text="{Binding Model.MyProperty, UpdateSourceTrigger=Explicit}" />
<Button Command="{Binding SaveCommand}" />

...データをTextBoxに取り込みます。では、[保存]ボタンが押されたときに、TextBoxから更新された値でモデルを更新するにはどうすればよいですか?

private void SaveExecute()
{
    // How do we update the Model.MyProperty value?
}
于 2011-08-11T19:48:07.197 に答える
1

正確には、ViewModelにViewについてあまりにも多くのことを知らせるのは良くありません。設定のコピーを更新して、バインディングにすべての作業を任せたほうがいいです。ユーザーが[構成の保存]ボタンをクリックすると、変更をリポジトリやモデルなどにさらに伝播します...

于 2010-02-18T17:46:05.933 に答える
1

ビュー モデルへのバインディングにこの機能を実装しないでください。ビューモデルに実装します。ビュー モデルのプロパティは、ビューの内容を常に反映する必要があります。これはビューのモデルであるため、ビュー モデルと呼ばれます。

次のようなプロパティでビューモデルを実装したため、この質問をしていると思います。

public string MyProperty
{
   get { return _Model.MyProperty; } 
   set
   {
      _Model.MyProperty=value;
      OnPropertyChanged("MyProperty");
   }
}

これをしないでください。プロパティ値をプライベート バッキング フィールドに保存し、「構成の保存」メソッドでモデル プロパティを更新します。

于 2011-08-11T18:47:14.373 に答える