我想为我的应用程序实现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;
}
}
有什么建议吗?
答案 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项。