最近我正在使用MVVM概念开发我的第一个项目(我使用WPF)。在我开始编写代码之前,我已经阅读了许多关于MVVM的教程(例如著名的 J.Smith 教程)。在我开始编码之前,我读到的所有内容都很清楚......
问题很简单:在视图层中,我有一个带有TextBox
es 的表单。假设几个TextBox
es,即:姓名,姓氏,电话号码。当用户填写所有这些并单击"确定"按钮时,我想将新人员(具有指定的个人详细信息)添加到我的本地数据库(我使用实体框架作为ORM)。
为此,我需要写这样的东西:
<Button Name="MyButton" Command="MyRelayCommandWhichNeedsAllOfTheTextboxes" Content="OK" />
使用CommandParameter
我可以将一个对象从视图传递到视图模型。有很多文本框,所以这可能不是一个好主意。
从XAML我可以分配给需要用户填写CommandParameter
整个表单。但是,在ViewModel中,我需要知道所有文本框的名称。MVVM 中的主要假设是所有层(视图、视图模型和模型)都必须是独立的。
最好的解决方案是什么?如何将输入数据从表单传递到ViewModel?
我建议将 relay 命令作为视图模型的一部分 - 这样,当命令被触发时,您将可以访问所需的所有属性。
XAML:
<Button Name="SurnameTextBox" Text="{Binding Surname,Mode=TwoWay}" />
<Button Name="MyButton" Command="{Binding MyRelayCommand}" Content="OK" />
查看模型:
public class MyViewModel : INotifyPropertyChanged
{
// (note, raise property changed on the setter
public string Surname { get; set; }
public ICommand MyRelayCommand { get; set; }
public MyViewModel
{
// set the command callback here
MyRelayCommand = new RelayCommand(OKCommandHandler);
}
private void OKCommandHandler(object parameter)
{
// save the record here using Surname, etc
// (note that you don't even need to use parameter, so you can just ignore it)
}
}
您不需要将数据从表单传递到视图模型,因为您的视图模型已准备好所有数据。
视图模型通过属性向视图公开所有数据,并绑定到视图。 看看Dbaseman的答案。