我创建了一个主窗口,在内容控件中显示各种用户控件。在这个窗口中,我将XAML中的用户控件及其附带的视图模型作为DataTemplate Resources。该窗口有一个按钮,需要在contentcontrol中显示用户控件并为其实例化视图模型。如何将资源传递给我的RelayCommand,以便我可以告诉命令使用哪个用户控件和视图模型?我想出了如何传递一个硬编码的字符串作为命令参数,但现在我想传递x:Name,所以我可以重复使用这个命令等多个View-ViewModel。
主窗口的XAML片段:
<Window.Resources>
<!--User Controls and Accompanying View Models-->
<DataTemplate DataType="{x:Type EmployerSetupVM:EmployerSetupVM}" x:Key="EmployerSetup" x:Name="EmployerSetup">
<EmployerSetupView:EmployerSetupView />
</DataTemplate>
<DataTemplate DataType="{x:Type VendorSetupVM:VendorSetupVM}">
<VendorSetupView:VendorSetupView />
</DataTemplate>
</Window.Resources>
<Button Style="{StaticResource LinkButton}" Command="{Binding ShowCommand}" CommandParameter="{StaticResource EmployerSetup}">
... 在主窗口的ViewModel中,到目前为止这里是相关代码:
public RelayCommand<DataTemplate> ShowCommand
{
get;
private set;
}
ShowCommand = new RelayCommand<string>((s) => ShowExecuted(s));
private void ShowExecuted(DataTemplate s)
{
var fred = (s.DataType); //how do i get the actual name here, i see it when i hover with intellisense, but i can't access it!
if (!PageViewModels.Contains(EmployerSetupVM))
{
EmployerSetupVM = new EmployerSetupVM();
PageViewModels.Add(EmployerSetupVM);
}
int i = PageViewModels.IndexOf(EmployerSetupVM);
ChangeViewModel(PageViewModels[i]);
}
... 换句话说,如何在XAML中获取我的DataTemplate w / x的名称:Key =“EmployerSetup”?如果重要的话,我也在使用MVVMLight
答案 0 :(得分:1)
private void ShowExecuted(DataTemplate s) {
var typeName = s.DataType as Type;
if (typeName == null)
return;
var className = typeName.Name; // className will be EmployerSetupVM or VendorSetupVM
...
}
我仍然说将DataTemplate
传递给VM似乎很奇怪。我只需要两个命令,并根据你获得的条件切换Button.Style
中使用的命令。
如果你&#34;有&#34;要使用单个RelayCommand
或世界可能会结束,我倾向于使用静态枚举,您可以从xaml引用CommandParameter
而不是传递整个DataTemplate
对象。