WPF - MVVM - условно включить пользовательские элементы управления для просмотра - PullRequest
3 голосов
/ 26 июля 2011

В WPF-приложении MVVM мне нужно создать представление для поиска учетной записи с двумя вариантами: простой поиск по учетной записи # или расширенный поиск (по имени, электронной почте и т. Д.)

В моей учетной записиSearchViewModel у меня есть свойство boolIsAdvancedMode.

Также я создал 2 пользовательских элемента управления для каждого режима: SimpleSearchView и AdvancedSearchView

Теперь мне нужно показать один из них на основе свойства IsAdvancedMode.

Каков наилучший способ сделать это?

Также в качестве общего решения, что если у меня есть свойство SearchMode, которое является enum.Как бы вы переключились между несколькими элементами управления в этом случае?

Ответы [ 3 ]

5 голосов
/ 26 июля 2011

Я думаю, вам нужно использовать Шаблон данных , для этого вам нужно создать три класса:

     public class Search
        {
            //Your Code
        }

        public class AdvanceSearch : Search
        {
           //Your Code
        }

        public class SimpleSearch : Search
        {
          //Your Code
        }

, а затем создать базу данных шаблонов на классах:

<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>
3 голосов
/ 26 июля 2011

Я бы использовал DataTrigger для замены ContentTemplate на 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>
2 голосов
/ 26 июля 2011

Я обычно отбрасываю их обоих, а затем использую BooleanToVisibilityConverter .Самый простой подход с настройками.

<Grid>
  <SimpleSearch />
  <AdvancedSearch 
          Visibility="{Binding IsAdvancedMode, Converter={StaticResource btvc}"/>
</Grid>

Когда IsAdvancedMode равен true, элемент управления AdvancedSearch будет перекрывать SimpleSearch.Опять же, это самый простой подход , не обязательно самый лучший.

...