我正在学习不同的 Prism 功能,现在我坚持打开新窗口。
我的应用程序外壳有主区域和细节区域。
Shell 的主区域具有 DataGrid,其中包含在单击时在 Detail 区域中显示其属性的项目。
我需要的是一种通过双击主区域中的项目来创建新窗口实例的方法。
每个新窗口都可以保持事件状态,直到我关闭它,所以我可以通过单击主区域中的任何其他项目来打开其他窗口。
在 MVVM-Prism 之前的时代,我可能会做类似的事情:
ICollection<Window> MyWindows = new List<Window>();
var wnd = MyWindows.SingleOrDefault(x => x.Name == id.ToString());
if (wnd == null)
{
wnd = new MyWindow(this, id);
MyWindows.Add(wnd);
}
wnd.Show();
但这对 Shell 的 ViewModel 和 Prism 来说是不行的……
从我的 Shell xaml 中使用了类似 InteractionRequestTrigger 的东西:
<prism:InteractionRequestTrigger SourceObject="{Binding CyberPopUpViewRequest, Mode=OneWay}">
<prism:PopupWindowAction>
<prism:PopupWindowAction.WindowContent>
<views:CyberPopUpView />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
但这允许我只创建一个窗口。
最佳答案
But this is a no-go from Shell's ViewModel and Prism...
没错,如果您将代码直接放在 View 模型中。但是,如果您将(阅读:隐藏)它放在服务中(作为依赖项注入(inject)并且可以在测试时用模拟替换),那完全没问题:
internal class WindowManager : IWindowManager
{
public void CreateWindow( string id )
{
Window wnd;
if (!_myWindows.TryGetValue( id, out wnd ))
{
wnd = new MyWindow( Application.Current.MainWindow, id );
_myWindows[ id ] = wnd;
}
wnd.Show();
}
private Dictionary<string, Window> _myWindows = new Dictionary<string, Window>();
}
关于wpf - Prism Mvvm Mef Interactivity 打开窗口新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40628537/