MVP和丰富的用户界面

时间:2011-08-25 15:27:33

标签: c# mvp

我想为我的应用程序实现MVP模式。 实际上是MVP Passive View。所以我遇到了一个问题,很简单, 但是不能决定我应该走哪条路 我想问你大师,如何正确使用MVP并显示丰富的用户界面。

我的意思是,我们假设我们需要显示一些数据,而客户希望它是TreeView。 需要的是,如果用户选择不同的treenode,则应用程序会自动更新 新数据或类似的东西。 此时,我不确定如何实现View。 (所有视图逻辑都转到演示者)

我认为公开WinForms类

并不是一个好主意
ISomeForm : IView {
 //Presenter will take control of this TreeView.
 TreeView Host {
  get;
  }
}

或公开我的数据模型

ISomeForm : IView {
 //View knows how to display this data
 List<MyDataNodes> Items {
  get;
  set;
 }
}

或使用其他View界面。

ISomeForm : IView {
 //Presenter knows what Views presenter should display.
 List<IDataView> Items {
  get;
  set;
 }
}

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我会使用View Interfaces。

在WPF MVVM中,我拥有的视图分离越多,就越容易管理UI / Logic交互。

答案 1 :(得分:1)

我必须使用MVC模式解决这个问题。您可以按照第一个示例中的建议公开TreeView。然后,演示者可以订阅TreeView的一些事件。但是如果你这样做,你的演示者可能不得不在你的表单上订阅很多不同控件的事件。我选择在表单上有一个事件,向控制器发送消息(在我的例子中)。消息表示为一个类,可以包含您需要的任何信息。这就是我的消息的样子:

public class MvcMessage
{
    public object Source { get; private set; }
    public MessageType MessageType { get; private set; }
    public Type EntityType { get; private set; }

    public IList InvolvedItems { get; set; }
    public int NumAffected { get; set; }
    public EventArgs SourceEventArgs { get; internal set; }

    /// <summary>
    /// Name of property who changed its value. Applies to models implementing INotifyPropertyChanged.
    /// </summary>
    public string PropertyName { get; set; }

    public MvcMessage(object source, MessageType messageType, Type entityType)
    {
        this.Source = source;
        this.MessageType = messageType;
        this.EntityType = entityType;
    }

    public void Reroute(Type newEntityType)
    {
        MvcMessage reroutedMessage = (MvcMessage)MemberwiseClone();
        reroutedMessage.EntityType = newEntityType;
        Controller.NotifyAll(reroutedMessage);
    }
}

...其中MessageType是包含许多常见命令和请求的枚举。

我的IView接口然后定义这样的事件:

public delegate void ViewEventHandler(MvcMessage message);

public interface IView : IViewPage, IWin32Window
{
    event ViewEventHandler ViewEvent;
    ...
}

答案 2 :(得分:1)

你应该更接近后两个例子;视图不应将WinForm-ish详细信息暴露给演示者。 See this answer有关使用TreeView更新确切处理问题的详细信息 - 尤其是第5项