Динамически изменяемый WPF ListView ItemsPanel & ItemsContainerStyle
У меня есть ListView в XAML, который отображает свою исходную коллекцию в виде GridView (с колонками). Однако я намерен использовать тот же ListView для отображения исходной коллекции, может быть в виде сетки изображений или какого-либо вида карты. Я хочу, чтобы ListView изменил сам себя в зависимости от выбора ComboBox. Так, скажем, для значения ComboBox 1 ListView должен отображать GridView, для значения 2 ListView должен отображать представление карты. В настоящее время мой ListView определяет GridView, установленный как его свойство View:
<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 ответ
Посмотреть список View
является свойством DependencyProperty ViewBase
, Итак, что вы можете сделать, это создать свои собственные пользовательские представления и установить их с помощью DataTrigger на выбранный элемент в выпадающем списке.
У Microsoft уже есть образец, доступный для этого онлайн, который вы можете скачать здесь.
ИЛИ ЖЕ
Может быть, вы можете определить два отдельных ListView в ресурсах как два отдельных шаблона данных.
<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>