1

场景是这样的:

我有一个在 WPF、MVVM、Prism 6.3.0 中开发的应用程序。这个应用程序认为

  • Shell.xaml(外壳)
  • UserControl1.xaml(在模块内,独立类库)

当我单击 Shell 中定义的 Button 时,我希望正在执行的命令和 CanExecute 中定义的条件得到验证。但是,这个命令被定义到作为模块视图模型的 ViewModel 类中(在这个应用程序中将有多个模块,加载为 Prism 传统上实现这一点)。

为了被调用,我尝试在Shell的资源集合中定义一个localviewmodel。这会触发命令,但不会触发条件 CanExecute。

如果我将用户控件中定义的 XAML 代码放在模块内(换句话说,如果我编写一个不使用内容区域管理器的简单应用程序)一个单页 XAML 应用程序,则该命令将毫无问题地验证 CanExecute。我最好的猜测是将模块视图模型中定义的命令绑定到 Shell 中的按钮的问题。在阅读了很多关于它的内容后,我只是没有得到声明绑定的正确方法。

这是一个例子:

<Telerik:RadRibbonView x:Name="BarraHerramientas" Grid.Row="0"
                           DockPanel.Dock="Top" 
                           ContentHeight="130" 
                           Height="160" 
                           Template="{DynamicResource RadRibbonViewStyle}" 
                           MinimizeButtonVisibility="Visible" 
                           HelpButtonVisibility="Visible" Background="Red">
        <Telerik:RadRibbonTab Header="1" 
                              Style="{DynamicResource RadRibbonTabStyle}" 
                              IsSelected="True" 
                              TabIndex="0">
            <Telerik:RadRibbonGroup Header="RibbonGroup1" 
                                    DialogLauncherVisibility="Visible">
                <Telerik:RadRibbonButton CollapseToMedium="Never" 
                                         CollapseToSmall="WhenGroupIsMedium" 
                                         IsAutoSize="True" 
                                         LargeImage="Agregar.png" 
                                         Size="Large" 
                                         SmallImage="Agregar_16x16.png" 
                                         Text="Add..." 
                                         Command="{Binding AddRecordCommand, Source={StaticResource LocalViewModel}}" 
                                         CommandTarget="{Binding ElementName=MyRecords}"
                                         CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" " 
                                         Telerik:ScreenTip.Description="..." />
            </Telerik:RadRibbonGroup>
        </Telerik:RadRibbonTab>
</Telerik:RadRibbonView>

其中 MyRecords 是保存数据的 GridView 的名称,LocalViewModel 是加载的模块中定义的 ViewModel 实例的键。因此,在 LocalViewModel 的某个时间点有两个实例,一个定义为 Shell.xaml 中的资源,另一个定义到包含“MyRecords”GridView 的已加载模块中。

当然,使用一页示例,这完美无缺。而且因为我需要编写几个模块,每个模块都定义了自己的 ViewModel,或者不止一个。所以,那是因为我需要使用从 Shell定义到不同模块的视图模型中的命令。如果我在 shell 中声明每个 ViewModel(大量数据进入)可能会是一个性能问题。

那么,如何将 ViewModel 中定义的命令(来自 shell)调用为“按需”加载的模块中的资源?

感谢大家。

4

1 回答 1

0

有多种方法可以实现您想要的。一种方法是使用 CompositeCommand。如果您的 ShellViewModel 将始终包含您用作参数的数据,这将适用于您。每个 ViewModel 都可以订阅父 CompositeCommand,并且每当调用 CompositeCommand 时,所有注册的 VM 命令也将被调用。您可以在此处查看 CompositeCommands 的示例:

https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/12-UsingCompositeCommands

另一种方法是将您的功能区按钮与您注入外壳的每个视图一起注入。因此,当您在外壳区域中添加/删除视图时,每个视图都会知道哪些选项卡需要添加/删除到功能区。您可以在我的 Pluralsight 课程 Prism Problems & Solutions: Loading Dependent Views 中看到如何做到这一点:

https://www.pluralsight.com/courses/prism-problems-solutions

于 2017-05-04T18:54:20.330 回答