WPF - MVVM - 有条件地包括要查看的用户控件

Mic*_* D. 4 wpf user-controls conditional mvvm

在WPF我的MVVM应用程序中,我需要创建一个帐户搜索视图,其中包含2个选项,简单搜索帐户#或高级搜索(按名称,电子邮件等)

在我的AccountSearchViewModel中,我有一个bool属性IsAdvancedMode.

此外,我为每种模式创建了2个UserControl:SimpleSearchView和AdvancedSearchView

现在我需要根据IsAdvancedMode属性显示其中一个.

最好的方法是什么?

另外作为一般解决方案,如果我具有枚举的SearchMode属性.在这种情况下,你如何在多个控件之间切换?

Beh*_*nam 5

我认为您需要使用Data Templating,为此您需要创建三个类:

     public class Search
        {
            //Your Code
        }

        public class AdvanceSearch : Search
        {
           //Your Code
        }

        public class SimpleSearch : Search
        {
          //Your Code
        }
Run Code Online (Sandbox Code Playgroud)

然后基于类创建数据模板:

<DataTemplate DataType="{x:Type local:AdvanceSearch }">
  <StackPanel>
    <TextBlock Text="{Binding Path=Name}" />
    <TextBlock Text="{Binding Path=Email}"/>    
  </StackPanel>
</DataTemplate>

<DataTemplate DataType="{x:Type local:SimpleSearch }">
  <StackPanel>
    <TextBlock Text="{Binding Path=Name}" />    
  </StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)


Rac*_*hel 5

我会根据需要使用 DataTrigger 来交换ContentTemplatea ContentControl。如果您有兴趣,我在这里写了一篇关于在 MVVM 中切换视图的文章(包含示例)

这是一些演示它的快速测试代码:

<Window.Resources>
    <DataTemplate x:Key="TemplateA" >
        <TextBlock Text="I'm Template A" />
    </DataTemplate>

    <DataTemplate x:Key="TemplateB" >
        <TextBlock Text="I'm Template B" />
    </DataTemplate>
</Window.Resources>

<StackPanel>
    <ToggleButton x:Name="Test" Content="Test" />

    <ContentControl>
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Setter Property="ContentTemplate" Value="{StaticResource TemplateA}" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=Test, Path=IsChecked}" Value="True">
                        <Setter Property="ContentTemplate" Value="{StaticResource TemplateB}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
    </ContentControl>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)