无法绑定 GridView 列中的项目列表

2024-01-09

我正在构建一个应用程序,向用户显示系列比赛的实时结果。我设置数据结构如下:Countries->Leagues->Matches特别是在 ViewModel 中,我创建了一个可观察的国家/地区集合,如下所示:

private ObservableCollection<Models.Country> _countries = new ObservableCollection<Models.Country>();

public ObservableCollection<Models.Country> Country
{
    get { return _countries; }
}

和型号:

public class Country
{
    public string Name { get; set; }
    public List<League> League { get; set; }
}

public class League
{
    public string Name { get; set; }
    public List<Event> Event { get; set; }
}

Event 类包含每个事件的属性,特别是事件的名称、日期等。

我对这些数据的估值如下:

Country country = new Country();
country.Name = "Italy";

League league = new League();
league.Name = "Serie A";
League league2 = new League();
league2.Name = "Serie B";

Event @event = new Event();
@event.MatchHome = "Inter";

Event event2 = new Event();
@event.MatchHome = "Milan";

league.Event = new List<Event>(); 
league2.Event = new List<Event>();

league.Event.Add(@event);
league2.Event.Add(event2);

country.League = new List<League>();

country.League.Add(league);
country.League.Add(league2);

lsVm.Country.Add(country); //lsVm contains the ViewModel

你如何看到我创建了一个名为country(意大利)在这种情况下将包含两个联赛(意甲)和(意乙)。每个联赛包含一场实际进行的比赛Serie A -> Inter and Serie B -> Milan

我将联赛二添加到国家/地区,最后将国家/地区添加到视图模型中的可观察集合中。到这里为止都没有问题。问题出在 xaml 中。

因此,我将所有这些内容组织在 GroupViews 中,为此我使用 CollectionViewSource,特别是:

<CollectionViewSource Source="{Binding Country}" x:Key="GroupedItems">
       <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="Name" />
            <PropertyGroupDescription PropertyName="League.Name" />
       </CollectionViewSource.GroupDescriptions>

上面的代码位于我的 Window.Resources 中,并告诉 CollectionViewSource 组织相关联赛的国家/地区名称和联赛名称。 我有两个 ListView,如下所示:

<ListView ItemsSource="{Binding Source={StaticResource GroupedItems}}" Name="Playing">
                    <ListView.View>
                        <GridView>
                            <GridViewColumn Header="Date" Width="150" DisplayMemberBinding="{Binding Path = League.Event.MatchDate}"/>
                            <GridViewColumn Header="Minutes" Width="70" DisplayMemberBinding="{Binding Path = League.Event.MatchMinute}"/>
                            <GridViewColumn Header="Home" Width="150" DisplayMemberBinding="{Binding Path = League.Event.MatchHome}"/>
                            <GridViewColumn Header="Score" Width="100" DisplayMemberBinding="{Binding Path = League.Event.MatchScore}"/>
                            <GridViewColumn Header="Away" Width="150" DisplayMemberBinding="{Binding Path = League.Event.MatchAway}"/>
                        </GridView>
                    </ListView.View>
<GroupStyle>
                            <GroupStyle.ContainerStyle>
                                <Style TargetType="{x:Type GroupItem}">
                                    <Setter Property="Template">
                                        <Setter.Value>
                                            <ControlTemplate>
                                                <Expander IsExpanded="True" Background="#4F4F4F" >
                                                    <Expander.Header>
                                                        <StackPanel Orientation="Horizontal" Height="22">
                                                            <TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="White" FontSize="22" VerticalAlignment="Bottom" />
                                                            <TextBlock Text="{Binding ItemCount}" FontSize="22" Foreground="Orange" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" />
                                                            <TextBlock Text=" Leagues" FontSize="22" Foreground="White" FontStyle="Italic" VerticalAlignment="Bottom" />
                                                        </StackPanel>
                                                    </Expander.Header>
                                                    <ItemsPresenter />
                                                </Expander>
                                            </ControlTemplate>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </GroupStyle.ContainerStyle>
                        </GroupStyle>

GroupStyle 包含将包含每场比赛的联赛,现在的问题是我看不到任何联赛和任何比赛,因为该项目位于列表内。因此,为了显示它们,我应该在 xaml 中编写以下代码:

<PropertyGroupDescription PropertyName="League[0].Name" /> 

修复了GroupStyle中联赛名称显示的bug 在 GridView 中:

<GridViewColumn Header="Casa" Width="150" DisplayMemberBinding="{Binding Path = League[0].Event[0].MatchHome}"/>

但这当然只会显示特定的项目..而不是项目列表。我需要帮助来解决这种情况,我无法弄清楚。谢谢。


如果您想使用ListView的分组功能,您必须为其提供要分组的项目的平面列表(在您的情况下为联赛),而不是标题项目。这CollectionView通过指定为您进行分组GroupDescriptions.

例如,假设League类有一个Country财产:

class ViewModel
{
    public ObservableCollection<Models.Country> Country { get; }

    public IEnumerable<League> AllLeagues => Country.SelectMany(c => c.Leagues);
}

public class League
{
    public string Name { get; set; }
    public List<Event> Event { get; set; }
    // add Country here
    public Country Country { get; set; }
}

class 

<CollectionViewSource Source="{Binding AllLeagues}" x:Key="GroupedItems">
   <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Country" />
   </CollectionViewSource.GroupDescriptions>

然后当你绑定列时,你直接绑定到League属性,例如:

<GridViewColumn Header="Date" DisplayMemberBinding="{Binding Path=Event.MatchDate}"/>

在组样式中您可以绑定到Country属性,就像你所做的那样。

替代解决方案

如果要在 WPF 中显示任何分层数据,您可以使用为其构建的控件(例如 Xceed 数据网格),或者将其与内置 WPF 数据网格的行详细信息一起使用。

这是一个示例 XAML(请注意,它使用您的原始数据结构没有我上面建议的修改)。它们本质上是 3 个相互嵌套的数据网格。每个网格都有自己的一组列,因此您可以为每个级别(国家、联赛、赛事)定义任何您想要的内容。

<Window x:Class="WpfApp.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"
        mc:Ignorable="d"
        xmlns:app="clr-namespace:WpfApp"
        d:DataContext="{d:DesignData ViewModel}">
    <FrameworkElement.Resources>
        <app:VisibilityToBooleanConverter x:Key="VisibilityToBooleanConverter" />
        <DataTemplate x:Key="HeaderTemplate">
            <Expander IsExpanded="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridRow}, Path=DetailsVisibility, Converter={StaticResource VisibilityToBooleanConverter}}" />
        </DataTemplate>
        <Style x:Key="DataGridStyle"
               TargetType="DataGrid">
            <Setter Property="RowHeaderTemplate"
                    Value="{StaticResource HeaderTemplate}" />
            <Setter Property="RowDetailsVisibilityMode"
                    Value="Collapsed" />
            <Setter Property="AutoGenerateColumns"
                    Value="False" />
            <Setter Property="IsReadOnly"
                    Value="True" />
        </Style>
    </FrameworkElement.Resources>
    <Grid>
        <DataGrid ItemsSource="{Binding Country}"
                  Style="{StaticResource DataGridStyle}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name"
                                    Binding="{Binding Name}" />
            </DataGrid.Columns>
            <DataGrid.RowDetailsTemplate>
                <DataTemplate>
                    <DataGrid ItemsSource="{Binding League}"
                              Style="{StaticResource DataGridStyle}">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Name"
                                                Binding="{Binding Name}" />
                        </DataGrid.Columns>
                        <DataGrid.RowDetailsTemplate>
                            <DataTemplate>
                                <DataGrid ItemsSource="{Binding Event}"
                                          AutoGenerateColumns="False"
                                          IsReadOnly="True">
                                    <DataGrid.Columns>
                                        <DataGridTextColumn Header="Match Home"
                                                            Binding="{Binding MatchHome}" />
                                    </DataGrid.Columns>
                                </DataGrid>
                            </DataTemplate>
                        </DataGrid.RowDetailsTemplate>
                    </DataGrid>
                </DataTemplate>
            </DataGrid.RowDetailsTemplate>
        </DataGrid>
    </Grid>
</Window>

您还需要我使用的转换器的代码:

public class VisibilityToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        => value as Visibility? == Visibility.Visible;

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        => value as bool? == true ? Visibility.Visible : Visibility.Collapsed;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法绑定 GridView 列中的项目列表 的相关文章

  • 求 a 范围内的 pow(a^b)modN

    对于给定的b and N以及一系列a say 0 n 我需要找到ans 0 n 1 where ans i 没有a s为此pow a b modN i 我在这里搜索的是可能的重复pow a b modN对于一系列a 以减少计算时间 例子 i
  • 您使用什么工具和技术来查找死代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪些工具和技术来查找 NET 中的死代码 过去 我用 Obsolete 属性修饰方法 传递 tr
  • HTML 文档

    有没有一个工具可以从 VS2010 生成的 XML 文档文件生成 HTML 页面 我在谷歌上搜索了这样的工具 但没有找到 我下载并安装了SandCastle 但我不明白如何使用它 尝试使用Sandcastle 帮助文件生成器 http sh
  • 在子目录中构建共享库

    我正在尝试构建一个使用一些 C 代码的 R 包 我有一个编译为可执行文件的 C 库 可以从命令行调用 有一个与之关联的 Makefile 我正在尝试获取信息here http cran r project org doc manuals R
  • 运行时两个注册之间的简单注入器基于动态上下文的注入

    我有一个使用 Simple Injector 进行命令处理程序注册的中介应用程序 并且注入和处理程序均已设置并完美运行 class DoWashingCommandHandler IRequestHandler
  • 如何从 std::vector 中删除元素而不调整其大小

    迭代器擦除 迭代器位置 迭代器擦除 首先是迭代器 迭代器最后 擦除元素 从向量中删除 容器可以是单个元素 位置 或一系列元素 第一个 最后一个 这有效地减少了向量 大小除以元素数量 删除 调用每个元素的 之前的析构函数 and remove
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • 在 Windows 服务中使用 OleDb 从 Excel 读取数据?

    免责声明 我知道这是一种不好的做事方式 这是我们与客户的唯一选择 Problem 我们需要每隔 x 时间从 Excel 文件读取数据 数据通过第三方 Excel 插件不断变化 应用程序的环境是 Windows XP SP1 和 Net 2
  • 如何在 C++ 中从模板基类的构造函数调用模板超类的构造函数?

    我正在使用 sublimetext3 用 c 进行编程 我的程序有一个名为 Array 的超类和一个名为 IntArray 的子类 这两个类都是模板类 目前 我在编译该程序时遇到问题 它不断在我的 IntArray cpp 文件中给出错误
  • 如何将 QSerialPort 模块添加到 CMake 中?

    我想将 QSerialPort 模块添加到 CMake 中 根据我的理解 我需要将QT 串口添加到 pro中 我只想使用 CMake 所以我尝试编译简单的 CMake 文件 但有错误 QtCore 正在工作 qDebug 可以毫无问题地显示
  • ASP.NET 中的 thread.sleep

    我正在为我的网站模拟彗星实时馈送协议 因此在我的控制器中我添加 while nothing new before timeout Thread Sleep 1000 但我注意到添加此功能后整个网站变慢了 调试后我得出结论 当我打电话时Thr
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • 如何“全局”捕获对象实例中引发的异常

    我目前正在编写一个 winforms 应用程序 C 我正在使用企业库异常处理块 遵循我所看到的相当标准的方法 IE 在 Program cs 的 Main 方法中 我已将事件处理程序连接到 Application ThreadExcepti
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 如何在 Windows 8.1 上打开多个 Visual Studio 窗口? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用的是 Windows 7 我能够启动多个 Visual Studio 并同时工作 现在我有 Windows 8 1 操作系统 每当我
  • 合并大文件的最佳方法是什么?

    我必须合并数千个大文件 每个大约 200MB 我想知道合并这些文件的最佳方法是什么 行将有条件地复制到合并文件中 可以使用 File AppendAllLines 或使用 Stream CopyTo 吗 使用 File AppendAllL
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似

随机推荐

  • 如何检测TMenuItem右键单击?

    平台 delphi 2010 将 Tmainmenu 拖放到 form1 上 将 Tpopupmenu 拖放到 form1 上 添加 mainmenu1 和 popupmenu 项目 主菜单 gt 文件 gt 项目1 弹出菜单 gt 弹出项
  • GLSL:如何执行类似 switch 的语句

    我想根据传递到着色器的数据动态调用缓动 所以用伪代码来说 var easing easings easingId var value easing point 我想知道在 GLSL 中完成此任务的最佳方法 我可以以某种方式使用 switch
  • VSCode:git staging 时触发organizeImports

    我喜欢 VSCode 中的自动组织功能 但让它在每次保存时都执行此操作给我带来了一些麻烦 editor codeActionsOnSave source organizeImports true 当我暂存导入时 是否可以设置一些 git h
  • 将 ObjectAid 安装到 eclipse LUNA 时出现错误

    我有 eclipse LUNA 我正在尝试安装 ObjectAid 来构建 UML 图 当我尝试安装它时 出现以下错误 An error occurred while collecting items to be installed ses
  • React Native:完成拖动后获取元素的实际 x,y 坐标(react-native-gesture-handler)

    我正在使用这个库 https github com software mansion react native gesture handler https github com software mansion react native g
  • 有没有一种正则语言来表示正则表达式?

    具体来说 我注意到正则表达式的语言本身并不是正则的 因此 我无法使用正则表达式来解析给定的正则表达式 我需要使用解析器 因为正则表达式本身的语言是上下文无关的 有没有什么方法可以用可以使用正则表达式解析结果字符串的方式来表示正则表达式 注意
  • 快速简单的图像哈希算法

    我需要一个 最好是简单且快速的 图像哈希算法 哈希值用于查找表 而不用于加密 一些图像是 计算机图形 即纯色填充矩形 光栅化文本等 而也有 摄影 图像 包含丰富的色谱 大部分平滑 具有合理的噪声幅度 我还希望哈希算法能够应用于特定的图像部分
  • 使用JFrame作为自定义输入框

    我正在开发一个基于 java swing 的应用程序 其中我有两个JFrames A 这是主窗口 并且B 这被称为A 我需要做的是 在A call B 获取用户输入B并将该输入传递给A以某种方式 然后处理它 我尝试过的一切都失败了 据我所知
  • MySQL 连接器 NO_CIPHERS_AVAILABLE 错误

    我正在使用 MySQL 连接器为我的简单 python 应用程序创建连接 但是每次运行它时 它都会失败并返回以下错误 2055 Lost connection to MySQL server at databaseHost system e
  • ResourceManager 包 - 包未正确加载

    我在 VS2015 和 cordova 项目中遇到问题 当天早些时候 我的项目进展顺利 但是 我将一个项目移动到一个新文件夹 现在 VS2015 无法正常工作 它正在运行 但不知何故 webessentials 被卸载 我的 gulpfil
  • PowerShell :: Microsoft.Azure.Commands.Sql.Database.Model.AzureSqlDatabaseModel.DatabaseName [重复]

    这个问题在这里已经有答案了 我编写了一个脚本 允许我查询整个 Azure 数据库公园 ErrorActionPreference SilentlyContinue Connect to Azure azureAccount Connect
  • 为什么 runBlocking 不会阻塞调用线程

    我试图理解 kotlin 中的 runBlocking println before runBlocking Thread currentThread name runBlocking but this expression blocks
  • Avro在消费端通过kafka自定义解码UUID

    我编写了一个类来将 UUID 类型的对象自定义编码为要在 kafka 和 avro 之间传输的字节 为了使用这个类 我放了一个 AvroEncode using UUIDAsBytesEncoding class 在我的目标对象中的 uui
  • BLOC 状态更改后有状态小部件未重建

    我无法理解为什么我的 Stateful 小部件在重建后没有更新状态 我有一个有状态的小部件 负责每秒递减一个计数器 因此它收到一个初始值 我将此初始值传递给状态并开始递减它 它还具有一个按钮 当按下该按钮时 会向我的块发送一个事件 该块会使
  • NoClassDefFoundError(初始化失败) - Websphere 和 IBM MQ

    我在部署到 Websphere 并与 IBM MQ 交互的基于 Spring 的 Web 应用程序上遇到问题 一切都很好 直到我尝试一些故障测试 当 Web 应用程序启动并运行时 我停止 IBM MQ 然后 我调用 Web 应用程序发送 J
  • 如何使用 Java 获取 Linux 中的总磁盘空间?

    我能够获得可用磁盘空间 我如何获得总磁盘空间 我的代码是 import java io IOException import org apache commons io FileSystemUtils public class DiskSp
  • 此 linq 查询是否在 for-each 循环的每次迭代上运行?

    在关于 SO 的另一个问题中 我用如下代码回答 并得到一条评论 即 LINQ 查询可能在 for each 的每次迭代中进行评估 真的吗 我知道 LINQ 查询在其项目被评估之前不会执行 因此这种迭代结果的方式似乎可以使其在每次迭代中运行
  • SQL / PHP PDO 选择随机行

    我希望能够随机选择一名未参加考试的学生 N 并回显姓名和主题 我怎样才能实现这个目标 query db gt prepare SELECT name FROM exams WHERE faced array array N query gt
  • 使用 GSON 解析 JSON

    我在使用 GSON 时遇到了一些问题 主要是从 JSON 反序列化为 POJO 我有以下 JSON events event id 628374485 title Developing for the Windows Phone event
  • 无法绑定 GridView 列中的项目列表

    我正在构建一个应用程序 向用户显示系列比赛的实时结果 我设置数据结构如下 Countries gt Leagues gt Matches特别是在 ViewModel 中 我创建了一个可观察的国家 地区集合 如下所示 private Obse