【问题标题】:PRISM WPF Custom interaction request - dynamic view controls don't show correctlyPRISM WPF 自定义交互请求 - 动态视图控件无法正确显示
【发布时间】:2018-05-23 15:47:32
【问题描述】:

我对 Prism / WPF 自定义交互请求弹出窗口有疑问。弹出窗口在第一次请求时正确呈现,但每个后续弹出窗口都重用相同的视图。这导致TextBlock 控件连接文本、滚动条不可见、ItemsControl 项目中的动态数据不可见、弹出窗口大小错误等。是否可以在每次新交互时强制创建新的弹出窗口请求或刷新弹出窗口中的所有控件?

为了显示弹出窗口,我使用 PRISM 文档中的标准代码,例如弹出窗口被实例化为:

PopUpViewModel displayData = reportCreator.GetReport();
this.CustomConfirmationRequest.Raise(displayData, res => { 
 if (res.Confirmed)  
 { ... }
});

其中PopUpViewModel 继承Confirmation, IInteractionRequestAware

XAML 是:

<prism:InteractionRequestTrigger SourceObject="{Binding CustomConfirmationRequest, Mode=OneWay}">
            <prism:PopupWindowAction IsModal="True" CenterOverAssociatedObject="True" WindowStartupLocation="CenterScreen"  >
                <prism:PopupWindowAction.WindowContent>
                    <popups:SoPopUp/>
                </prism:PopupWindowAction.WindowContent>
            </prism:PopupWindowAction>
        </prism:InteractionRequestTrigger>

【问题讨论】:

    标签: wpf prism


    【解决方案1】:

    代替

    <prism:PopupWindowAction IsModal="True" CenterOverAssociatedObject="True" WindowStartupLocation="CenterScreen">
      <prism:PopupWindowAction.WindowContent>
        <popups:SoPopUp/>
      </prism:PopupWindowAction.WindowContent>
    </prism:PopupWindowAction>
    

    你可以使用

    <prism:PopupWindowAction IsModal="True" CenterOverAssociatedObject="True" WindowStartupLocation="CenterScreen" WindowContentType = "{x:Type popups:SoPopUp}"/>
    

    当您指定 WindowContent 时,SoPopUp 的实例会在加载此 xaml 时创建一次。然后每次触发 PopupWindowAction 时都会重用它。如果您指定 WindowContentType,则每次触发 PopupWindowAction 时都会重新创建一个 SoPopUp 实例。另请注意,DI 用于实例化 SoPopUp,因此 SoPopUp 构造函数可能具有要由 DI 解析的参数。

    【讨论】:

    • 太棒了,谢谢。在您回复后,我还在 GitHub 上找到了您的讨论。为什么这从未进入 PRISM 文档?供其他人参考,这解释了问题:github.com/PrismLibrary/Prism/issues/432
    • @dvorn:您能否添加一个注释,强调 WindowContentTypeWindowContent 前者每次都会创建新实例而不是重复使用单个实例?
    • @lekso Current Prism WPF 文档实际上是由 Microsoft 的模式和实践团队为版本 5 创建的。从那时起,Prism WPF 并没有太大变化。只有一些小补充。最显着的变化是 DelegateCommand。我自己写文档有点害羞,因为英语不是我的母语。
    【解决方案2】:

    最好的办法是创建一个正确的视图模型,以应对被重用,例如详细的here

    可以尝试使用RegionMemberLifetimeAttribute,但我真的不指望这会有所帮助,因为您没有进行导航...

    【讨论】:

    • 我遇到的问题不是数据。更新的视图模型绑定到视图,我可以看到更新的数据。问题是窗口控件保持第一个弹出请求的状态。因此,如果我在第一个弹出窗口中的列表有两个项目,那么视图会将它们呈现为两个记录(使用 ItemsControl WPF 控件)。如果第二个弹出窗口的视图模型有 4 个项目,那么只有前两个会呈现。这两项将正确绑定,但其他两项不会显示。弹出窗口中的每个控件都会发生这种情况。
    • 您确定通知视图的所有更改吗?如果您不使用ObservableCollection,则必须通知弹出视图模型的集合属性。您所描述的听起来像是您通知了前两项的更改,而不是列表的更改。
    • 请查看我对 dvorn 回复的评论。滚动到链接页面的底部:)
    • 不错的发现!但我真的对重用视图模型时得到的行为的原因感兴趣。如果你碰巧发现了,请给我留言
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多