【问题标题】:Data entry procedure in WPF using MVVMWPF中使用MVVM的数据输入过程
【发布时间】:2020-07-18 13:09:48
【问题描述】:

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

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

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

...

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

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

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    Button 有一个类型为 ICommandDependencyProperty,称为 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
            }
    }
    

    xaml:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 2017-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多