【问题标题】:How to implement a WPF ViewModel with PRISM INavigationAware instantiated as a resource in XAML如何使用在 XAML 中实例化为资源的 PRISM INavigationAware 实现 WPF ViewModel
【发布时间】:2020-01-09 15:54:42
【问题描述】:

我尝试在我的 ViewModel 中实现 INavigationAware 接口,并将 ViewModel 实例化为 XAML 中解释的资源 https://blog.rsuter.com/recommendations-best-practices-implementing-mvvm-xaml-net-applications/ 喜欢这个示例:

<UserControl x:Class="My.Namespace.MySampleView" ...> 
    <UserControl.Resources> 
        <viewModels:MySampleViewModel x:Key="ViewModel" /> 
    </UserControl.Resources> 
    <Grid DataContext="{StaticResource ViewModel}"> 
        ... 
    </Grid> 
</UserControl>

但使用此实现,ViewModel 中的 INavigationAware 方法不会在导航到视图或从视图导航时调用。
一种解决方案是在 Code-Behind 中设置 View (UserControl) 的 DataContext。

这里的最佳做法是什么?

【问题讨论】:

    标签: c# wpf mvvm prism


    【解决方案1】:

    INavigationAware 中的方法在您导航 到视图模型时被调用,即

    • 您定义一个区域(例如 ContentControl),
    • 使用IContainerRegistry注册一个导航视图
    • 然后使用IRegionManager 将该区域导航到视图。

    例子:

    <ContentControl prism:RegionManager.RegionName="MyRegion"/>
    
    containerRegistry.RegisterForNavigation<MyView, MyViewModel>();
    
    regionManager.RequestNavigate( "MyRegion", "MyView" );
    

    ...现在MyViewModel.OnNavigatedTo 将被调用(给定MyViewModel 实现INavigationAware)...

    作为旁注,一些“最佳实践”链接真的很糟糕。

    【讨论】:

    • 我添加了链接,特别是为了解释使用的“视图模型实例化和分配”。在这里,Rico Suter 建议视图模型应该在 XAML 中的根元素的 Resources 元素中实例化。然后将其绑定到视图根元素的子元素的 DataContext 属性。因此,您可以在 XAML 中将功能用作代码完成和 IntelliSense。
    • 这尤其是一个可疑的建议,因为代码完成和智能感知可以通过设置DesignDataContext 来实现,而不会干扰视图模型的创建。其次,强制视图创建其视图模型会阻止您将视图用作DataTemplate 用于您已经拥有的视图模型实例,即视图模型优先。第三,如果视图创建了视图模型,则视图模型必须没有依赖项(因为视图本身是由框架而不是您的容器创建的),除非您诉诸ServiceLocator abomination。
    • 您知道 WPF MVVM 视图和视图模型创建的更好的最佳实践教程吗?
    • 当然,prism 文档只是一个开始,应该有几个关于 prism 的复数视觉课程。我认为曾几何时,我的第一个联系点是brianlagunas.com/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    相关资源
    最近更新 更多