首页 > 解决方案 > WPF - 将嵌套的自定义对象绑定到数据网格

问题描述

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

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>

谢谢你们的帮助。

标签: c#xmlwpf

解决方案


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

主窗口

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.


推荐阅读