【问题标题】:Binding DataGrid to List in wpf将 DataGrid 绑定到 wpf 中的列表
【发布时间】:2010-12-16 10:54:23
【问题描述】:

我正在尝试将List 绑定到DataGrid。 这是代码sn-p:

public class Parson
{
    public string LastName { get; set; }
    public string FirstName { get; set; }

    public Parson(string lastName, string firstName)
    {
        LastName = lastName;
        FirstName = firstName;
    }
}

public class Persons : List<Parson>
{
    // Parameterless constructor      
    public Persons()
    {
    }
    public new void Add(Person parson)
    {
        base.Add(parson);
    }
}  

后面的代码:

Persons persons = new Persons();
persons.Add(new Parson("New","Person");
dataGrid1.DataContext = persons;

xaml:

<my:DataGrid Name="dataGrid1" 
             xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" 
             CanUserAddRows="True" 
             ItemsSource="{Binding}" 
             AutoGenerateColumns="False">
    <my:DataGrid.Columns>
        <my:DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"/>
        <my:DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}"/>
    </my:DataGrid.Columns>
</my:DataGrid>

结果是显示一个空的网格! 有人知道为什么吗?

【问题讨论】:

  • xaml: schemas.microsoft.com/wpf/2008/toolkit" CanUserAddRows="True" ItemsSource="{Binding}" AutoGenerateColumns="False"> 我的:DataGrid.Columns>
  • 您的输出窗口是否包含与此绑定相关的任何内容?
  • 您的代码运行并为我工作。你在哪里设置网格的 DataContext?我在 Window.Loaded 中设置它。
  • 您需要做的第一件事是打开数据绑定的调试消息:i.stack.imgur.com/MF8i5.png 接下来,重新运行并检查输出窗口,看看有什么错误。最后,修正你的拼写错误。牧师是牧师的一种。拼写错误会在绑定中杀死你,因为没有类型安全。
  • 你把这段代码放在哪里?在 window 的构造函数中还是其他地方?

标签: wpf data-binding datagrid


【解决方案1】:

尝试设置AutoGenerateColumns = true

【讨论】:

    【解决方案2】:

    (注意:此答案已在 .NET Framework v4.0 中验证):

    一个简单的 4 部分操作...

    • 首先,在 XAML 标记中的 DataGrid 控件上,我建议您设置 AutoGenerateColumns="False"(您应该能够手动执行此操作,而不是自动执行此操作)
    • 其次,在同一个控件集ItemsSource="{Binding}" 上,它通知网格它将从设计时未定义的源获取其列和行数据。
    • 第三,构造列以查看您希望它们的外观,并使用Binding="{Binding Path=UniqueID}" 之类的内容将每个列绑定到列数据。请注意, Path 之后的值是插值的,因此请注意区分大小写之类的事情。对于您要定位的 List,该值可能是目标 List 中对象的属性名称之一。根据需要对 DataGrid 中的每一列冲洗并重复多次。
    • 第四,在您的表单代码隐藏中、在构造函数中或在表单加载期间或最适合您需要的任何地方,设置网格的 DataContext。这应该采用类似于{gridControlName}.DataContext = {target-List&lt;&gt;} 的形式

    加载表单时,其网格应自动填充列表中对象的内容。

    【讨论】:

    • 我还必须确保所有 DataGrid 列都引用类属性(例如 public int MyColumn { get; set; })而不仅仅是类字段(例如 public int MyColumn; )
    • 并且设置 .DataContext 属性需要在 InitializeComponent() 被调用后的某个时间发生
    【解决方案3】:

    尝试设置 ItemsSource 而不是 DataContext,并从 XAML 中删除 ItemsSource={Binding}。这可能会奏效。

    编辑:

    我刚刚检查了一些使用相同 DataGrid 控件 (WPF Toolkit) 编写的代码,实际上我设置了 ItemsSource 而不是 DataContext。如果您需要示例,请告诉我。

    【讨论】:

      【解决方案4】:

      在您的 DataGrid 中尝试:

      ItemsSource="{Binding Path=.}"
      

      这对我来说很成功。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-18
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        • 1970-01-01
        • 2021-04-11
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多