动态列表视图显示基于 Itemsource {Binding} to ObservableCollection< "this can change and dictates listview s



问题摘要:在运行时操作xaml页面视图模型中相同的单个ObservableCollection(绑定到页面的ListView(的正确方法是什么,以显示不同的数据集,每个数据变体提供自己的ListView- 通过StyleSelectorStyle

描述:
我有一个包含单个ListView的 UWP xaml 页面,我希望此列表视图显示用户可能想要查看的所有不同可能的数据集。 例如:数据集可以是 1 到 15 列数据,所有数据都有标题。ListViewItemSource将使用绑定到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数据类型的 xamlListViewStyle(存储在ResourceDictionary中(,或者至少是这样的想法。

我不知道ObservableCollection的数据类型应该是通用的还是每个数据集定义的类来查看。后者是有道理的,因为StyleSelector需要它来提供相关的Style.

我使用了StyleSelector而不是DataTemplateSelector,因为我希望选择器包含HeaderTemplateItemTemplate(列的标题随着不同的数据集而变化(:

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);
}
}

StyleResourceDictionary中的示例:

<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>

StyleSelectorXAML 页中定义的:

<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),您需要为不同的标题和列制作GroupStyleSelectorItemTemplateSelector

<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock
Margin="5"
FontSize="25"
Foreground="Gray"
Text="{Binding Name}"
/>
</StackPanel>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>

有关更多详细信息,请参阅此文档。

相关内容

最新更新