gpt4 book ai didi

c# - 如何插入多个GroupDescription?

转载 作者:行者123 更新时间:2023-11-30 23:26:04 27 4
gpt4 key购买 nike

我制作了一个应用程序,可以获取比赛的实时结果。现在每场比赛的组织是这样的:

Nation->League->Match list

NationLeague 的容器,LeagueMatch 的容器。我首先做的是创建一个 XAML 结构,使我能够实现容器结果,如前所述:

<Window x:Class="GroupBox_Header.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:GroupBox_Header"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid Margin="10">
<ListView Name="lvUsers">
<ListView.View>
<GridView>
<GridViewColumn Header="Home Team" Width="50" DisplayMemberBinding="{Binding HomeTeam}" />
<GridViewColumn Header="Away Team" Width="50" DisplayMemberBinding="{Binding AwayTeam}" />
</GridView>
</ListView.View>

<ListView.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="Gray" FontSize="22" VerticalAlignment="Bottom" />
<TextBlock Text="{Binding ItemCount}" FontSize="22" Foreground="Green" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" />
<TextBlock Text=" Items" FontSize="22" Foreground="Silver" FontStyle="Italic" VerticalAlignment="Bottom" />
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander IsExpanded="True">
<Expander.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding League}" FontWeight="Bold" Foreground="Gray" FontSize="22" VerticalAlignment="Bottom" />
</StackPanel>
</Expander.Header>
<ItemsPresenter />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</ListView.GroupStyle>
</ListView>
</Grid>

你怎么能看到有一个 ListView 有一个 GroupStyle 定义,我在其中保存了所有 Nation。您可以在演示解决方案中尝试使用 XAML 并检查结果。

在此之后,我创建了允许我存储值的结构:

public struct League 
{
public string Name { get; set; }
}

public struct Country
{
public string Name { get; set; }
public League League;
}

非常简单,League 结构用于保存所有联赛,Country 结构用于保存国家。我以这种方式确定了 Country:

List<Country> items = new List<Country>();
items.Add(new Country() { Name = "Italy", League = { Name = "Serie A"} });
items.Add(new Country() { Name = "Italy", League = { Name = "Serie B" } });
items.Add(new Country() { Name = "England", League = { Name = "Premiere League" } });
items.Add(new Country() { Name = "Spain", League = { Name = "Primeira Division" } });
lvUsers.ItemsSource = items;

所以我实际上在列表中有 意大利 (2)、英国、西类牙。然后,我在 ListView(XAML 控件)的 ItemsSource 中插入了 items

为了将标题组创建为 Nation 名称,我使用了 CollectionView:

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvUsers.ItemsSource);
PropertyGroupDescription groupNations = new PropertyGroupDescription("Name");

此代码允许我创建多个 header ,结果正是我想要的。我也为 League 做了同样的事情,因为我需要的是将 League 名称作为 sub-header 插入 Nation 容器( header ):

        view.GroupDescriptions.Add(groupNations);
PropertyGroupDescription groupCompetions = new PropertyGroupDescription("League");
view.GroupDescriptions.Add(groupNations);

但实际上是这样的结果:

enter image description here

如何只看到国家标题出现,而 League 标题没有出现在 Nation 标题中。我做错了什么?

最佳答案

您可以通过使 League 成为属性(添加 getter 和 setter - WPF 绑定(bind)附加到属性,而不是字段)来“修复”它,使第二组描述由 “League. Name" 而不仅仅是 "League" 并使第二组样式 TextBlock 绑定(bind)绑定(bind)到 Name,而不是 League

然后你得到这个:

enter image description here

但我要说的是,您采用了错误的方式,并以一种非常奇怪的方式对数据进行建模。如果 ListView 旨在列出 Matches,那么您应该绑定(bind)到一组 Match 对象(或它们的 View ),并且每个Match 应该引用它的父 League,每个 League 应该引用它的父 Country

或者,使用树而不是列表,然后有一个 Country 和子 Leagues 的集合,每个 League 有子 Matches 的集合。

或者两者都有 - League 包含 Matches 的集合,但每场比赛都有一个父级 League 引用,对于 国家/联赛

它在您的代码中的方式有​​点奇怪。

此外,我不明白为什么您对对象使用结构而不是类。

对隐藏代码的更改(注意,我并不是说这是一个好方法,见上文):

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

List<Country> items = new List<Country>();
items.Add(new Country() { Name = "Italy", League = new League { Name = "Serie A" } }); // Added "new League"
items.Add(new Country() { Name = "Italy", League = new League { Name = "Serie B" } });
items.Add(new Country() { Name = "England", League = new League { Name = "Premiere League" } });
items.Add(new Country() { Name = "Spain", League = new League { Name = "Primeira Division" } });
lvUsers.ItemsSource = items;

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvUsers.ItemsSource);
PropertyGroupDescription groupNations = new PropertyGroupDescription("Name");
view.GroupDescriptions.Add(groupNations);
PropertyGroupDescription groupCompetions = new PropertyGroupDescription("League.Name"); // Changed "League" to "League.Name"
view.GroupDescriptions.Add(groupCompetions); // Fixed the variable name here

lvUsers.ItemsSource = view; // Added, you probably have it but didn't post it
}
}

public struct League
{
public string Name { get; set; }
}

public struct Country
{
public string Name { get; set; }
public League League { get; set; } // added getter and setter
}

对 XAML 的更改,仅 1 行:

<TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="Gray" FontSize="22" VerticalAlignment="Bottom" />

{Binding Name} 是您原始代码中的 {Binding League}

关于c# - 如何插入多个GroupDescription?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37026326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com