1

私はMVVMを学び始めており、ViewModelでデータリストを対応するList<>にバインドする方法を見てきました。次に、さまざまなフィールドを持つフォームを実現する必要があります。ユーザーがボタンをクリックすると、データをローカル データベースに保存する必要があります。

「MVVM が最も多い」アプローチはどれですか? ViewModel にメソッドを実装しSaveItem(Item){}、コード ビハインドでボタン クリックに対して次のようなことを行うと思います

Item item = new Item();
item.field1 = txt1.Text;

...

item.fieldn = txtn.Text;
myViewModel.SaveItem(item);

よりクリーンな方法が必要だと思います。

4

1 に答える 1

2

AButtonには、と呼ばれるDependencyPropertyタイプがあり、そのプロパティが設定されている場合、がクリックされたときにコマンドが呼び出されます。ICommandCommandPropertyButton

通常、MVVMでは、タイプのプロパティを公開しICommand(実装を作成するか、フレームワークから取得する必要があります)、次のようにXAMLでバインドします。

<Button Content="My Button"
        Command="{Binding MyCommand}" />

ビューモデル:

public class MyViewModel : INotifyPropertyChanged
 {
    public ICommand MyCommand 
    {
        get { … }
    }

    …
 }

これで、コードビハインドは必要ありません。

保存したいテキストを取得することに関しては、コードビハインドではなく、ビューモデルへのデータバインディングを優先する必要があります。

読み取る代わりにTextBox.Text、そのプロパティをビューモデルにバインドします。

ビューモデル:

public class MyViewModel : INotifyPropertyChanged
{
  …

    private string _myText;
    public string MyText
    {
        get { return _myText; }
        set 
        {
            _myText = value;
            // raise property change notification
        }
}

xaml:

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

TwoWayバインディングモードを使用していることに注意してください。TextBoxそうすれば、ビューモデルの変更を(実装する必要がある理由です)に反映でき、のINotifyPropertyChanged変更TextBoxはビューモデルに伝播されます。

デフォルトでは、ビューモデルはフォーカスを失っUpdateSourceTriggerたときにのみ更新されるため、設定も追加しました。TextBoxこのようにして、値が変更されるたびにビューモデルが更新されます。アプリケーションで意味のあるものを使用してください。

于 2012-09-28T13:21:15.710 に答える