Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# PRISM-为每个交互请求创建一个新的对话框实例-_C#_Wpf_Prism - Fatal编程技术网

C# PRISM-为每个交互请求创建一个新的对话框实例-

C# PRISM-为每个交互请求创建一个新的对话框实例-,c#,wpf,prism,C#,Wpf,Prism,我面临一个问题: 如果我对该对话框执行第一个请求并将其添加到Grid.Children…有时我必须在激活的对话框中调用另一个对话框,在这种情况下,传递的是同一个实例抛出该操作,并且应用程序尝试再次将同一个实例添加到Grid.Children…我得到一个异常 对于我在视图模型中执行的每个请求,我想创建一个新的“视图:DialogControl”实例,我如何才能完成它 遵循我的观点互动: <i:Interaction.Triggers> <prism:Int

我面临一个问题:

如果我对该对话框执行第一个请求并将其添加到Grid.Children…有时我必须在激活的对话框中调用另一个对话框,在这种情况下,传递的是同一个实例抛出该操作,并且应用程序尝试再次将同一个实例添加到Grid.Children…我得到一个异常

对于我在视图模型中执行的每个请求,我想创建一个新的“视图:DialogControl”实例,我如何才能完成它

遵循我的观点互动:

    <i:Interaction.Triggers>
        <prism:InteractionRequestTrigger SourceObject="{Binding Path=NotificationToDialog}">
            <views:MessageAction>
                <views:MessageAction.Dialog>
                    <views:DialogControl />
                </views:MessageAction.Dialog>
            </views:MessageAction>
        </prism:InteractionRequestTrigger>
    </i:Interaction.Triggers>

您可以传递用于创建对话框的工厂,而不是对话框本身的实例。也就是说,您实现了一个
MessageAction.DialogFactory
属性来代替
MessageAction.Dialog
。 然后,在(修改的)
消息操作
中,您可以在触发时从工厂创建一个新的对话框


但是,如果只是将新对话框塞入父网格(例如禁用其他对话框等),则可能会遇到其他问题。最好在操作中对交互请求进行排队。

什么是
MessageAction.Dialog
?如果您为每个显示对话框请求创建一个
ContentControl
作为对话框元素,然后不传递
DialogControl
的具体实例,而是将其建模为刚刚创建的
ContentControl
ContentTemplate
,则可以避免问题

这将使您的操作保持通用性,并为每个请求创建一个新实例。例如,MessageAction.DialogTemplate的
类型可以是
DataTemplate