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

标签 wpf mvvm prism mef

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

相关文章:

wpf - 为什么 Blend 2012 不允许我创建非 Windows 商店项目?

c# - 在 WPF 数据绑定(bind)中使用和、或等组合 bool 值

wpf - 使用 MVVM 显示 View 的正确方法

c# - 使用 MVVM 选择并复制 WPF 文本框中的文本

wpf - MVVM/Prism : Where should dialog box strings be stored?

.net - 找不到任何 Caliburn Micro with Prism 的 sample

wpf - 如何以编程方式将选项卡项添加到 prism 中的选项卡控件

c# - 是否可以在 wpf 中使用 silverlight 引用?

c# - 验证 MVVM 中的空字段

c# - WPF 以编程方式在 Viewmodel 类上设置 DataTemplate