从View输入创建对象并将其传递给ViewModel(在MVVM中)

时间:2012-11-05 17:58:16

标签: wpf entity-framework xaml mvvm viewmodel

最近,我正在使用 MVVM 概念开发我的第一个项目(我使用 WPF )。在开始编写代码之前,我已经阅读了许多关于 MVVM 的教程(例如,着名的J.Smith's)。在我开始编码之前,我所读到的一切都很清楚......

问题很简单:在 View 图层中,我有一个TextBox es的表单。我们假设一些TextBox es,即:姓名姓氏电话号码。当用户填写所有内容并点击确定按钮时,我想将新人(带有指定的个人详细信息)添加到我的本地数据库(我使用实体框架ORM)。

要做到这一点,我需要写这样的东西:

<Button Name="MyButton" Command="MyRelayCommandWhichNeedsAllOfTheTextboxes" Content="OK" />

使用CommandParameter我可以将一个对象从 View 传递到 ViewModel 。有很多文本框,所以它可能不是一个好主意。

XAML 我可以分配到需要由用户填写的CommandParameter整个表单。但是,在 ViewModel 中,我需要知道所有文本框的名称。 MVVM中的主要假设是所有层(View,ViewModel和Model)必须是独立的。

什么是最好的解决方案?如何将输入数据从表单传递到 ViewModel

2 个答案:

答案 0 :(得分:1)

我建议将relay命令作为View Model的一部分 - 这样,当命令被触发时,您将可以访问所需的所有属性。

<强> 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)
    }
}

答案 1 :(得分:1)

您不需要将数据从表单传递到viewmodel,因为您的viewmodel已经拥有了所有数据。

您的viewmodel会将所有数据通过属性公开给您的视图并绑定到它。看看dbaseman的答案。