1

我开始学习 MVVM 并且已经看到如何将数据列表与 ViewModel 中的相应 List<> 绑定。现在我需要实现一个具有不同字段的表单,当用户单击按钮时,我必须将数据保存到本地数据库。

哪种是“最 MVVM”方法?我想SaveItem(Item){}在 ViewModel 中实现一个方法,并在后面的代码中,为按钮单击做类似的事情

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

...

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

我认为必须有一种更清洁的方法。

4

1 回答 1

2

AButtonDependencyProperty类型ICommand为,如果设置了该属性,则单击CommandProperty时将调用该命令。Button

通常在 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
        }
}

xml:

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

请注意,我们使用的是TwoWay绑定模式。这样,视图模型中的更改可以反映在TextBox(这就是您需要实现的原因INotifyPropertyChanged)中,并且TextBox将传播到视图模型中。

我还添加了设置,因为默认情况下,只有在失去焦点UpdateSourceTrigger时才会更新视图模型。TextBox这样,只要值更改,视图模型就会更新。在你的应用程序中使用任何有意义的东西。

于 2012-09-28T13:21:15.710 回答