gpt4 book ai didi

wpf - Prism Mvvm Mef Interactivity 打开窗口新实例

转载 作者:行者123 更新时间:2023-12-03 10:57:35 25 4
gpt4 key购买 nike

我正在学习不同的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com