Dynami c Отображение ListView на основе Itemsource {Binding} с ObservableCollection <"это может изменяться и определять стиль просмотра списка"?> - PullRequest
0 голосов
/ 17 июня 2020

Краткое изложение вопроса: Каков правильный способ манипулировать одним и тем же одиночным 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. Не слишком ли я усложнил это начинание неправильным подходом?

1 Ответ

0 голосов
/ 18 июня 2020

ItemContainerStyle тип цели - ListViewItem, поэтому вы не можете создать стиль ListView в ItemContainerStyleSelector.

Исходя из вашего требования (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>

Более подробную информацию см. В этом документе .

...