根据参数切换 view/view 模型

Switching view/view model based on a parameter

在 wpf 应用程序中,我必须根据传递给主视图模型的参数显示不同的过滤器用户控件。每个过滤器的视图模型都实现了 IReportFilter 并且主视图模型有一个 属性 类型

IReportFilter Filters {get;set;}

如何解析正确的 xaml 视图?

提前致谢

尝试以下方法

<ContentControl Content="{Binding SomeContent}"/>

然后在 viewmodel 中根据您的需要创建两个控件,并根据您的过滤器简单地切换它们

更新

如果您不想在 ViewModel 中创建控件,那么您可以执行以下操作:

<Grid>
    <Column / Rows Definitions>
<YourControl1 Grid.Row="X" Grid.Column="Y" IsVisible={Binding BoolFilter1, Converter={StaticResource Bool2Visibility}/>
<YourControl1 Grid.Row="X" Grid.Column="Y" IsVisible={Binding BoolFilter2, Converter={StaticResource Bool2Visibility}/>
....
</Grid>

假设您有一个基础 class 而不是 IReportFilter,比如 ReportFilter。
按照以下步骤操作:
1. 为 Filter1VM 和 Filter2VM 定义数据模板并设置用户控件。
请注意,我在定义控件和 VM 时有命名约定。

<DataTemplate DataType={x:type viewModels:Filter1VM}>
<usercontrols:Filter1/>
</DataTemplate>
<DataTemplate DataType={x:type viewModels:Filter2VM}>
<usercontrols:Filter2/>
</DataTemplate>


2.您需要定义一个自定义的DataTemplateSelector。

class CustomDataTemplateSelector:DataTemplateSelector
{
  public ovverride DataTemplate SelectTemplate(object item,....)
  {
    Type t=item.GetType();
    string typename=t.Name;
    string viewName=typeName.Replace("VM",String.Empty);
    DataTemplate dt=App.Current.Resources[viewname] as DataTemplate;
    return dt;
  }
}

3.Define ReportFilter 中的 属性 TemplateSelector class 并在构造函数中将其初始化为:

TemplateSelector=new CustomDataTemplateSelector();

4。在您的 window 的 VM 中,创建 ReportFilter 过滤器 属性:

ReportFilter Filter {get;set;}
  1. 在你的应用程序Window中,在你需要放置filterControl的地方添加ContentControl:

    ContentControl Content="{绑定过滤器}" ContentTemplateSelector="{绑定Filter.TemplateSelector}"

  2. 在您的 window 视图模型中,根据传递的参数将 Filter 指定为 Filter1VM/Filter2VM。