Краткое изложение вопроса: Каков правильный способ манипулировать одним и тем же одиночным ObservableCollection
в модели просмотра xaml-страницы (привязанной к ListView
страницы) во время выполнения, чтобы показать разные наборы данных, каждый вариант данных предоставляет свои собственные ListView
- Style
через StyleSelector
?
Описание: У меня есть xaml-страница UWP с одним ListView
, я хочу, чтобы этот список отображал все различные возможные наборы данных, которые пользователь может захотеть увидеть. например: набор данных может содержать от одного до 15 столбцов данных, все с заголовками. ListView
s 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
, чтобы предоставить xaml ListView
Style
(который хранится в ResourceDictionary
), на основе типа данных ObservableCollection
, или, по крайней мере, это была идея. Я не знаю, должен ли тип данных ObservableCollection
быть общим c или определенным классом для каждого набора данных для просмотра. Последнее имеет смысл, поскольку StyleSelector
потребуется, чтобы logi c предоставил соответствующий 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. Не слишком ли я усложнил это начинание неправильным подходом?