我希望你们能帮助我,因为我找不到任何有助于理解我的问题的有用信息:
我正在尝试在我的 C# WinForms 应用程序上实现一种被动 MVP 方法,该应用程序具有 ListView 和相应的详细 View 。
到目前为止,我得到了以下结构(伪代码):
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
}
我的问题是:我只能显示一次编辑表单。一旦我尝试第二次打开它,我的 View (表单)就会被释放(System.ObjectDisposedException)。
我该如何解决?我在这里有错误的方法吗?我是否取消表单的关闭并隐藏它并相信垃圾收集器在处理 DetailPresenter
后收集它?每次 Edit
事件被触发时,我是否创建(new())一个新的演示者?然后我将不得不引入某种工厂,因为我不知何故失去了依赖注入(inject)。如果有人能指出这种情况下的最佳做法以及我在这里可能做错了什么,我将不胜感激。
最佳答案
我前一阵子在做 Winforms MVP,所以不确定我是否可以提供帮助,但我的情况如下。 在我的方法中, View 拥有演示者,伪代码:
MyForm form = new MyForm(new PresenterX);
form.Show(); //or showdialog
在这种情况下实例在关闭后仍然存在。
在您的情况下,由于演示者拥有 View ,一旦不使用演示者,GC 可能会处理演示者和包含的 View 。 或者即使 Presenter 仍在使用中,因为 View 是私有(private)的,GC 可能会在关闭后收集它。
尝试在 Release 模式下调试,看看关闭表单实例会发生什么。
编辑:
另一个想法是: 先创建 View 实例,然后传递给演示者
所以可能会失败的方法(我没有看到完整的代码所以猜测)
UserDetailPresenter p = new UserDetailPresenter(new YourView());
尝试
YourForm view = new YourForm(); //as global variable, view should be reusable anyway
代码中的某处
UserDetailPresenter p = new UserDetailPresenter(view);
p.Show(userInstance);
关于c# - 列表+详细信息 - 最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20685048/