Prism Mvvm Mef Interactivity打开窗口新实例

时间:2016-11-16 09:37:01

标签: wpf mvvm prism mef

我正在学习不同的Prism功能,现在我不得不打开新窗口了。 我的应用程序Shell具有主区域和详细信息区域。 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>

但是这允许我只创建一个窗口。

1 个答案:

答案 0 :(得分:3)

  

但这是Shell的ViewModel和Prism的禁忌......

是的,如果您将代码直接放在视图模型中。但是如果你把它(读取:隐藏)放在一个服务中(它作为依赖注入,并且在测试时可以用mock替换),那就完全没了问题:

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>();
}