问题摘要:在运行时操作xaml页面视图模型中相同的单个ObservableCollection
(绑定到页面的ListView
(的正确方法是什么,以显示不同的数据集,每个数据变体提供自己的ListView
- 通过StyleSelector
Style
?
描述:
我有一个包含单个ListView
的 UWP xaml 页面,我希望此列表视图显示用户可能想要查看的所有不同可能的数据集。 例如:数据集可以是 1 到 15 列数据,所有数据都有标题。ListView
的ItemSource
将使用绑定到ObservableCollection
来填充它。ObservableCollection
可以手动填充,也可以使用许多SQL
来源DataTable
之一进行填充。
<ListView x:Name="UserPageListView"
ItemsSource="{Binding MainListData, Mode=TwoWay}"
Grid.Column="1"
Width="auto"
Background="Gray"
ItemContainerStyleSelector="{StaticResource UserPage_StyleSelector}">
</ListView>
我尝试绑定ItemContainerStyleSelector
以提供基于ObservableCollection
数据类型的 xamlListView
Style
(存储在ResourceDictionary
中(,或者至少是这样的想法。
我不知道ObservableCollection
的数据类型应该是通用的还是每个数据集定义的类来查看。后者是有道理的,因为StyleSelector
需要它来提供相关的Style
.
我使用了StyleSelector
而不是DataTemplateSelector
,因为我希望选择器包含HeaderTemplate
和ItemTemplate
(列的标题随着不同的数据集而变化(:
public class UserPage_StyleSelector:StyleSelector
{
public Style WatchlistStyle { get; set; }
public Style UserDetailStyle { get; set; }
protected override Style SelectStyleCore(object item, DependencyObject container)
{
if (item is WatchlistData)
return WatchlistStyle;
if (item is UserDetailData)
return UserDetailStyle;
return base.SelectStyleCore(item, container);
}
}
Style
ResourceDictionary
中的示例:
<Style TargetType="ListView"
x:Key="UserDetail_ListView"
x:Name="UserDetail_ListView">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid Padding="12"
Background="{ThemeResource SystemBaseLowColor}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<TextBlock Text="UserDetails"
Style="{ThemeResource CaptionTextBlockStyle}"/>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="{Binding Details}"
FontSize="12"
VerticalAlignment="Center"/>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
StyleSelector
XAML 页中定义的:
<Page.Resources>
<viewModels:UserPage_StyleSelector x:Key="UserPage_StyleSelector"
WatchlistStyle="{StaticResource WatchList_ListView}"
UserDetailStyle="{StaticResource UserDetail_ListView}"/>
</Page.Resources>
该ResourceDictionary
在 app.xaml.cs 中定义。我是否因为使用错误的方法而使这项工作过于复杂?
ItemContainerStyle
目标类型是ListViewItem
,所以你不能在ItemContainerStyleSelector
中制作ListView
样式。
从您的需求派生(headers of columns change with the different data sets)
,您需要为不同的标题和列制作GroupStyleSelector
和ItemTemplateSelector
。
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock
Margin="5"
FontSize="25"
Foreground="Gray"
Text="{Binding Name}"
/>
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
有关更多详细信息,请参阅此文档。