MVVM:IView与数据绑定

MVVM:IView与数据绑定,mvvm,Mvvm,我阅读MVVM是为了在我的表示层视图中采用它。理想情况下,我希望对WinForms、ASP.NET和SL使用相同的方法 我遇到了两种不同的方法,我想收集这些方法(可能还有其他方法)的意见: “带接口的视图”以及视图与ViewModel的数据绑定位置 “使用界面查看” 在这种方法中,我们有一个接口IView,它包含: -设置/获取典型字段值的属性 -视图上发生的操作的事件 其工作方式是将IView的具体实现注入到ViewModel中。然后,ViewModel将连接 事件。然后,它还通过属性“推送”

我阅读MVVM是为了在我的表示层视图中采用它。理想情况下,我希望对WinForms、ASP.NET和SL使用相同的方法

我遇到了两种不同的方法,我想收集这些方法(可能还有其他方法)的意见:

“带接口的视图”以及视图与ViewModel的数据绑定位置

“使用界面查看” 在这种方法中,我们有一个接口IView,它包含: -设置/获取典型字段值的属性 -视图上发生的操作的事件

其工作方式是将IView的具体实现注入到ViewModel中。然后,ViewModel将连接

事件。然后,它还通过属性“推送”和拉取字段值。它还可以通过

这些事件。可以通过IView属性激活和停用控件

视图的具体实现在WinForms中很容易,但不确定其他技术和SL中的“可混合性”

public interface IMyView
{
  event EventHandler SomeActionClicked;

  Boolean CanEditField1 { get;set; }
  string Field1 { get;set; }
}

public class MyConcreteView: Form,IMyView
{
  public event EventHandler SomeActionClicked;

  public Boolean CanEditField1
  {
   get { return edtField1.Enabled; }
   set { edtField1.Enabled = value; }
  }
  public string Field1
  {
   get { return edtField1.Text; }
   set { edtField1.Text = value; }
  }

  private void btnAction_Click(object sender,EventArgs e)
  {
    SomeActionClicked(sender,e);
  }
}


public class ViewModel
{
  public ViewModel(IMyView view)
  {
    this.view = view;
    view.SomeActionClicked += SomeActionHandler;
  }

  private void SomeActionHandler(object sender,EventArgs e)
  {
    view.CanEditField = !view.CanEditField;  // Or whatever 'state' the ViewModel or Model is
    view.Field1 = DateTime.Now.ToString(...);
  }

  private IMyView view;
}
数据绑定视图 另一种方法是ViewModel,它有几个反映模型的属性(数据/字段值、UI控件状态等)

然后,视图使用数据绑定“显示”视图上UI控件中的字段值(模型)。ViewModel还控制

UI控件状态通过数据绑定到的属性。视图中的操作通过

连接到的视图模型


这些方法有什么(不明显的)优点和缺点?

也许您实际上只需要在winforms中作为属性的“演示者”查看,而在SL中,所有布线都是通过xaml完成的,这将需要更少的模板。 因此,当视图特定于winforms时,请将视图模型保存在公共代码库中。 对于ASP.NET来说,这些viewmodel事件并不适合连接,除非您使用丑陋的老式webforms控件和回发

我真的看不出这两种方法之间的区别,这两种方法都适用于SL

保持简单