场景是这样的:
我有一个在 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)调用为“按需”加载的模块中的资源?
感谢大家。