我一直在思考这个问题,并正在寻找最佳解决方案。要重现此问题,只需:
- Add a new Window in a new WPF application.
Add the following code:
public MainWindow() { InitializeComponent(); //add code Window1 w1 = new Window1(); //following is in my actual project DataContext = new AllUserQueryiesViewModel(new CommonQueryTestSubWindow()); }
Run and close MainWindow.
---------更新-----------------
我想最好还是分享一下我实际项目中的场景,这样你就能更好地理解我为什么要这样做。想象一下一个查询列表和打开查询功能,就像针对TFS工作项查询一样。我正在创建一些用户控件来完成这个任务,供我们团队中的其他人在同一应用程序中使用。查询列表和打开的查询位于不同的用户控件中,因此用户(其他程序员)可以将打开的查询放在任何位置(ContentControl)中。这些是ViewModels:
public class AllVM
{
public AllVM(IOneVMContainer container)
{
OneVMs = new ObservableCollection<OneVM>()
{
new OneVM(container),
new OneVM(container)
};
}
public ObservableCollection<OneVM> OneVMs { get; set; }
public OneVM SelectedOneVM { get; set; }
public void OpenOne()
{
SelectedOneVM.Open();
}
}
public class OneVM
{
IOneVMContainer container;
public OneVM(IOneVMContainer container)
{
this.container = container.NewInstance();
}
//I want to open and close the view from viewmodel
public void Open()
{
container.GetContentCtl().Content = this;
container.Show();
}
public void Close()
{
container.Close();
}
}
为了在ViewModel中打开和关闭视图,我创建了这样的接口
//Is it good to use interface?
//Maybe a better interface?
public interface IOneVMContainer
{
IOneVMContainer NewInstance();
void Show();
void Close();
ContentControl GetContentCtl();
}
使用上述视图模型:
请注意以下几点使用要点:
//my usercontrol to hold AllVM
public AllUC()
{
InitializeComponent();
DataContext = new AllVM(new OneContainerWindow());
}
//implement by other team members
public partial class OneContainerWindow : Window,IOneVMContainer
{
public OneContainerWindow()
{
InitializeComponent();
}
public IOneVMContainer NewInstance()
{
return new OneContainerWindow();
}
public ContentControl GetContentCtl()
{
return contentCtl1;
}
}
我想知道是否必须将窗口存储在ViewModel中,这是主要问题。我知道你一定有更好的解决方案,请帮忙。
private Window window = new Window();
也会显示相同的行为。我想说的是,窗口只需要以某种方式关闭即可。 - Clemens