2014-02-18 3 views
1

У меня есть ListView в XAML, который отображает его исходную коллекцию в стиле GridView (с колонками). Однако я намерен использовать тот же ListView, чтобы отображать исходную коллекцию, может быть в сетке изображений или в виде карты. Я хочу, чтобы ListView менял себя на основе выбора ComboBox. Итак, скажем, для значения ComboBox 1 ListView должен отображать GridView, для значения 2 ListView должен отображать вид карты. В настоящее время мой ListView указывает GridView установлен как его Посмотреть собственности:Динамически меняющиеся элементы списка элементов WPFPanel & ItemsContainerStyle

<ListView ItemsSource="{Binding PersonList}" Width="450" HorizontalAlignment="Right" IsSynchronizedWithCurrentItem="True"> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}" /> 
       <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}" /> 
       <GridViewColumn Header="Ip Address" DisplayMemberBinding="{Binding Path=IpAddress}" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 

Я хотел бы знать, как я могу изменить ListView для отображения различных представлений, основанных на ComboBox триггеров.

ответ

1

ListView View является DependencyProperty типа ViewBase. Итак, что вы можете сделать, это Создайте свои собственные виды и можете установить его через DataTrigger on combobox, выбранный элемент.

У Microsoft уже есть образец, доступный для него онлайн, который вы можете скачать с here.

ИЛИ

Может быть, вы можете определить две отдельные управления ListView в ресурсах в двух отдельных DataTemplates.

<Window.Resources> 
    <DataTemplate x:Key="GridViewTemplate"> 
     <ListView/> <!-- GridView --> 
    </DataTemplate> 
    <DataTemplate x:Key="CardViewTemplate"> 
     <ListView/> <!-- CardView --> 
    </DataTemplate> 
</Window.Resources> 

и имеют один ContentControl на месте, и вы можете поменять его содержание на основе выбранного значения в выпадающем списке.

<ContentControl> 
    <ContentControl.Style> 
     <Style TargetType="ContentControl"> 
     <Setter Property="Content" 
       Value="{StaticResource GridViewTemplate}"/> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding SelectedValue}" Value="Value2"> 
        <Setter Property="Content" 
          Value="{StaticResource CardViewTemplate}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 
+1

Оба кажутся идеальными решениями ... но если бы мне пришлось сделать выбор, который я должен выбрать ... согласно вам, какое из решений было бы лучше реализовать ... с точки зрения представление. – Lucifer

+1

Если у вас более двух шаблонов, я бы предложил первый подход, в противном случае вам понадобится второй подход. Влияние производительности похоже на меня, так как во время выполнения вы меняете шаблон. В первом случае вы меняете шаблон ListView и во втором случае шаблон ContentControl. –

Смежные вопросы