我正在使用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与View
和Module
一起使用,但是无法弄清楚如何处理Window
才能获得与上述代码相同的结果,但是松散耦合的响应。而不是直接从ViewModel
内部调用它。
有没有办法或者我必须处理完全不同的事情?
编辑:
我只是想说明一下,我在问一种称为System.Windows.Window
的MVVM / PRISM方式。与“是/否/取消”弹出对话框无关。
答案 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的功能版本中将删除此交互机制。现在正在实现一种新的处理对话框的方法:。它是PRISM库的预发行版本。