【问题标题】:WPF - Binding nested custom objects to datagridWPF - 将嵌套的自定义对象绑定到数据网格
【发布时间】:2018-09-18 11:48:01
【问题描述】:

我有一个相当大的对象,它的一些属性应该显示在数据网格中。问题是绑定做得不好,嵌套的对象值是空的。

MainCustomObject 是:

public class MainCustomObject
{
    public int Id { get; set; }
    public string Name { get; set; }
    public CustomObject1 CustomObject1 { get; set; }
}

CustomObject1 是:

public class CustomObject1
{
    public string Name { get; set; }
    public string Url { get; set; }
}

而我的 XAML 代码是:

<DataGrid ItemsSource="{Binding MainCustomObjectList}" AutoGenerateColumns="False">
<DataGrid.Columns>
    <DataGridTextColumn Header="Name" Width="75" Binding="{Binding Name}" />
    <DataGridTextColumn Header="CustomObject1_Name" Width="75" Binding="{Binding CustomObject1.Name}" />
    <DataGridTextColumn Header="CustomObject1_Url" Width="75" Binding="{Binding CustomObject1.Url}" />
</DataGrid.Columns>
</DataGrid>

感谢大家的帮助。

【问题讨论】:

  • is not doing well 什么?我的意思是:它有什么问题?
  • ItemsSource 必须是 IEnumerable。什么是“对象列表”?
  • CustomObject1 长什么样子?它有公共的 Id 和 Name 属性吗?
  • @Stefan 我的意思是它没有显示值!都是空的
  • @mm8 这只是 IEnumerable 的名称。为了防止误会改了。

标签: c# xml wpf


【解决方案1】:

我测试了您的代码,它以这种方式工作,即创建并显示一行。您的命名空间或类名可能不同。

主窗口

public partial class MainWindow : Window
{
    public IEnumerable<MainCustomObject> MainCustomObjectList { get; set; } = new List<MainCustomObject>
    {
        new MainCustomObject
        {
            Id = 1,
            Name = "Name1",
            CustomObject1 = new CustomObject1
            {
                Name = "Custom name 1",
                Url = "Url 1"
            }
        }
    };
    public MainWindow()
    {
        InitializeComponent();
    }
}

XAML

<Window x:Class="WpfApp2.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:WpfApp2"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<StackPanel>
    <DataGrid ItemsSource="{Binding MainCustomObjectList}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Name}" />
            <DataGridTextColumn Header="CustomObject1_Name" Binding="{Binding CustomObject1.Name}" />
            <DataGridTextColumn Header="CustomObject1_Url" Binding="{Binding CustomObject1.Url}" />
        </DataGrid.Columns>
    </DataGrid>
</StackPanel>
</Window>

请注意,我将DataContext 绑定到我自己的实例。否则它将显示您报告的相同错误,即一个空列表。您还想确保列表已完全初始化,正如 mm8 所怀疑的那样。如果只填充了第一列,则表明属性CustomObject1null

【讨论】:

    【解决方案2】:

    您只能将ItemsSource 属性绑定到IEnumerable(包括实现IEnumerable 接口的任何类型)。因此,如果 MainCustomObjectList 返回 IEnumerable&lt;MainCustomObject&gt; 并且 CustomObject1 类型具有公共的 NameUrl 属性,这些属性实际上填充了一些值,那么您的 XAML 标记应该可以工作。

    还要确保DataGridDataContext 是定义MainCustomObjectList 属性的类的实例。

    【讨论】:

    • @Stefan:IEnumerable 是您实现的接口。所有实现这个接口的类确实都是IEnumerables
    • 但是,这个fastest-gun-in-the-west 风格的帖子根本没有回答这个问题,因为你不能等到 OP 澄清了 cmets 中的问题。
    • @Clemens:如果它没有回答问题,那么问题是什么?
    • 现在您已经阅读了有关该问题的所有 cmets,您知道它至少与您在这里提到的内容无关。您答案中的所有内容都只是猜测,事实证明这不是问题的根源。它仍然给了你两个赞成票,这就是你想要的。但是您在上一条评论中提出了正确的问题。
    • 我稍微编辑了我的答案以添加必须设置属性才能使任何值显示在 DataGrid 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多