2011-02-01 4 views
3

У меня есть приложение wpf-mvvm.Как скрыть/показать элементы в панели стека?

В том, что я follwoing ...

<Combo box> 
item 1 
item 2 
</Combo box> 
<stack pnel> 
<user control 1 /> 
<user control 1 /> 
</stack pnel> 

Если пользователь выбирает «пункт 1» от комбо, мне нужно, чтобы отобразить «пользовательский элемент управления 1» Если пользователь выбирает «пункт 2» от комбо, я необходимо отобразить «пользовательское управление 2»

В модели просмотра ... У меня есть IList этих двух элементов списков со списком.

Каков наилучший способ скрыть/показать здесь предметы?

ответ

5

Вы можете полностью удалить StackPanel, так как вы будете показывать только один UserControl за раз.

Как только вы это сделали, вы можете использовать technique described here, чтобы привязать значение ComboBox к видимости UserControl. Просто установите Visibility в Collapsed для UserControl, который не выбран.

Это позволяет полностью справиться с этим в XAML.

+0

Позвольте мне попробовать. Благодарю. – Relativity

1

Существует всегда еще один способ сделать это :-)

Например, вы можете сделать очень простой способ: подписаться на SelectionChanged, проверьте что выбранный элемент, и настроить видимость элементов - быть скрытым, чтобы рухнуть.

Есть более сложные способы, но я сомневаюсь, что они необходимы для этой простой задачи. Однако с развитием вашего кода вам может потребоваться пересмотреть этот подход.

+0

Подписывание событиям, поиск элементов управления в визуальном дереве и их свойства должны быть последним средством в WPF, а не первым. Использование стилей и триггеров обрабатывает большинство случаев, подобных этому, и не требует написания (или тестирования или поддержки) любого кода. –

+0

@Robert: просто сравните сложность кода. Подписка на события тривиальна, найти именованный элемент управления так же просто, как доступ по имени, задание свойства через код - задача детского сада. Создание правильного стиля с помощью соответствующих триггеров сложнее, требует большего количества кода и, по крайней мере, промежуточных знаний, и точно так же хорошо поддерживается, как и код. И я вежливо не согласен с вашим мнением, что код XAML не является кодом. – Vlad

+0

Я думаю, что стили и триггеры WPF являются фундаментальными знаниями, а не промежуточными. XAML - это данные, а не код. Это подтверждает мнение Стива Макконнелла о том, что данные легче отлаживать, чем код до предела, но я все же считаю, что это применимо. –

1

Это демонстрирует два простых способа, которыми вы можете использовать стиль для изменения видимости элементов на основе выбора в поле со списком. Первый стиль проверяет SelectedIndex в поле со списком, а второй проверяет его SelectedValue. В этом примере я заполнил поле со списком со строковыми объектами, но вы можете использовать SelectedValue с любым видом объекта, если знаете, что его метод ToString() возвращает.

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:system="clr-namespace:System;assembly=mscorlib"> 
    <DockPanel> 
    <ComboBox x:Name="comboBox" DockPanel.Dock="Top"> 
    <system:String>Item 1</system:String> 
    <system:String>Item 2</system:String> 
    </ComboBox> 
    <TextBlock DockPanel.Dock="Top" Text="This displays if Item 1 is selected"> 
    <TextBlock.Style> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding ElementName=comboBox, Path=SelectedIndex}" Value="0"> 
     <Setter Property="Visibility" Value="Visible"/> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </TextBlock.Style> 
    </TextBlock> 
    <TextBlock DockPanel.Dock="Top" Text="This displays if Item 2 is selected."> 
    <TextBlock.Style> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Visibility" Value="Collapsed"/> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding ElementName=comboBox, Path=SelectedValue}" Value="Item 2"> 
     <Setter Property="Visibility" Value="Visible"/> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </TextBlock.Style> 
    </TextBlock> 
    </DockPanel> 
</Page> 
Смежные вопросы