在PRISM中处理“弹出” Window.xaml

时间:2019-03-27 13:15:18

标签: c# wpf prism

我正在使用MVVM和PRISM 7开发WPF应用程序。

在某些地方,我想通过单击一个按钮来打开一个新的Window.xaml

因此,我创建了Window.xaml,并在单击该按钮/命令时像这样调用它:

private void OnInstrumentFinderCommand()
{
    var instrumentfinder = new InstrumentFinderWindow();
    var result = instrumentfinder.ShowDialog();
    if (result == true)
    {
        // logic here...   
    }
}

那很好。 InstrumentFinderWindow打开,我可以与它进行交互。

但这破坏了我想通过MVVM实现的松散耦合。

我知道如何将PRISM与ViewModule一起使用,但是无法弄清楚如何处理Window才能获得与上述代码相同的结果,但是松散耦合的响应。而不是直接从ViewModel内部调用它。

有没有办法或者我必须处理完全不同的事情?

编辑: 我只是想说明一下,我在问一种称为System.Windows.Window的MVVM / PRISM方式。与“是/否/取消”弹出对话框无关。

1 个答案:

答案 0 :(得分:1)

可以使用 交互用户体验 来完成PRISM方式的调用弹出对话框。

in PRISM documentation对此方法进行了详尽的介绍,in prism samples中有大量示例,说明如何正确进行DialogService(25-NotificationRequest,26-ConfirmationRequest,27-CustomContent,28-CustomRequest)。

在ViewModel中声明InteractionRequest<T>属性:

public InteractionRequest<Notification> FindInstrumentRequest { get; }

在命令内引发请求

private void OnInstrumentFinderCommand() {
    FindInstrumentRequest.Raise(
        new Notification(), 
        notification =>
        {
             //the dialog shown, logic here
        });
}

将交互触发器添加到窗口视图

<UserControl ...
             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
             xmlns:prism="http://prismlibrary.com/">

    <i:Interaction.Triggers>
        <prism:InteractionRequestTrigger SourceObject="{Binding FindInstrumentRequest}">
            <prism:PopupWindowAction IsModal="True" CenterOverAssociatedObject="True">
                <prism:PopupWindowAction.WindowContent>
                    <views:InstrumentFinderWindow />
                </prism:PopupWindowAction.WindowContent>
            </prism:PopupWindowAction>
        </prism:InteractionRequestTrigger>
    </i:Interaction.Triggers>

...

</UserControl>

通过IInteractionRequestAware实现InstrumentFinderWindowViewModel界面,并完成与FinishInteraction调用的交互。

public partial class InstrumentFinderWindowViewModel: UserControl, IInteractionRequestAware
{
    private void SelectInstrument()
    {
        FinishInteraction?.Invoke();
    }

    public Action FinishInteraction { get; set; }
    public INotification Notification { get; set; }
}

您可以创建NotificationRequest的派生类型,并使用它在窗口和对话框之间传递数据。

重要添加: PRISM的功能版本中将删除此交互机制。现在正在实现一种新的处理对话框的方法:I hope this works。它是PRISM库的预发行版本。