我希望你们能帮助我,因为我找不到任何有助于理解我的问题的有用信息:
我试图在我的 C# WinForms 应用程序上实现一种被动 MVP 方法,该应用程序具有列表视图和相应的详细视图。
到目前为止,我有以下结构(伪代码):
ListPresenter(new Repository(), new ListView(), new DetailPresenter(new DetailView());
执行:
public class UserDetailPresenter : IPresenter<IUserDetailView>
{
private IDetailView _view;
public UserDetailPresenter(IDetailView detailView)
{
_view = detailView;
}
public void Show(IUser user)
{
InitializeView(user);
_view.Show();
}
}
public class UserListPresenter
{
//private members (_userRepo, _listView, _detailPresenter)
public UserListView(IUserRepository userRepo, IListView listView, IDetailPresenter detailPresenter)
{
//wire up private members..
_listView.EditCommandFired += this.ShowEditForm;
}
private void OnListViewEditCommandFired(object sender, EventArgs args)
{
_detailPresenter.LoadUser(_listView.SelectedUser);
_detailPresenter.Show(); //modal
}
}
public class UserListForm : Form, IUserListView
{
public event EventHandler EditCommandFired;
public IUser SelectedUser { get { return gridView.FocusedRowHandle as IUser; } }
public void LoadUsers(List<IUser> users)
{
gridView.DataSource = users;
}
// other UI stuff
}
我的问题是:我只能显示一次编辑表单。当我第二次尝试打开它时,我的视图(表单)被释放(System.ObjectDisposedException)。
我该如何解决?我在这里有错误的方法吗?我是否取消表单的关闭并隐藏它并信任垃圾收集器在处理后收集它DetailPresenter
?每次Edit
触发事件时,我是否创建(new() up)一个新的演示者?然后我将不得不引入某种工厂,因为我不知何故失去了依赖注入。如果有人能指出这种情况下的最佳实践是什么样的以及我在这里可能做错了什么,我会很感激。