【问题标题】:WPF Datagrid binding errors with dots in column headersWPF Datagrid 绑定错误,列标题中带有点
【发布时间】:2012-12-07 14:43:45
【问题描述】:

我有一个 .Net 数据表,用作 WPF 数据网格的源。我遇到的问题是数据表中的某些列标题包含点。将数据表绑定到数据网格时,会显示包含点的列,但不包含数据。

在网上阅读后,我发现点是数据绑定引擎中使用的一种特殊符号,并且混淆了数据网格与表格的绑定。

我尝试手动创建数据网格列 + 绑定并添加方括号来否定点。这工作正常,但是当我对列进行排序时会中断。 This article 提到挂钩到排序事件以删除排序事件上的 []。没有太多关于如何实现这一点的细节,我所做的尝试似乎并没有消除错误。

如果您需要更多信息,请告诉我。

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

    正如您所发现的,除Binding 之外的任何点表示法在 WPF 中都存在问题。我建议修改您的标题以使用点表示法为列名起别名:

    Col.A should be Col_A
    Col.B should be Col_B
    etc...
    

    如果标头来自直接 SQL 查询,则以相同方式为 sql 列名设置别名。

    继续使用点表示法只会继续导致一个骇人听闻的修复来解决之前的“修复”。只需修改您的命名约定,所有这些都可以轻松解决。

    【讨论】:

    • 我可以完全控制列名,但希望有一种方法可以将 .'s 包含在我的列标题中。一个例子是“粘合后的最大厚度”。如果您认为这真的不可能,我可能会在列名中强制使用 no .。
    • 我相信这是可能的,就像在上游游泳是可能的一样 :) 一种方法就简单多了。由于您可以完全控制您的命名约定,我肯定会走这条路。也就是说,我很少(如果有的话)将数据表用作与 WPF 中的任何内容的绑定,因为 WPF 确实是围绕使用属性绑定而设计的,因此很可能还有其他一些方法可以用于数据表和 WPF 绑定。
    • 真是一场噩梦。花几个小时解决这个问题
    【解决方案2】:

    Magnus Montin已解决the question at Microsot WPF Forum

    AutoGeneratedColumns 在现实场景中很少有用。但 你也可以处理AutoGeneratingColumn 事件:

    <DataGrid Name="dataGrid" AutoGenerateColumns="True" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" />
    
    
     private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
     {
        e.Column = new DataGridTextColumn() { Header = e.PropertyName, Binding = new Binding("[" + e.PropertyName + "]") };
     }
    

    反正这种视图相关的代码肯定是属于视图的。 视图模型不知道也不关心 DataGrid 由于某种原因,控件无法显示实际数据。这必须是 并且应该固定在视图中。

    它就像一个魅力!我的例子开始起作用了:

    XAML:

    <DataGrid ColumnWidth="35" ItemsSource="{Binding EmployeeDataTable, 
        IsAsync=True}" VirtualizingStackPanel.IsVirtualizing="true" 
        EnableRowVirtualization="True" EnableColumnVirtualization="True"
        MaxWidth="2560" MaxHeight="1600"  
        VirtualizingStackPanel.VirtualizationMode="Recycling" 
        VirtualizingPanel.IsVirtualizingWhenGrouping="True"/>  
    

    背后的代码:

    private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
       e.Column = new DataGridTextColumn() { 
           Header = e.PropertyName, 
           SortMemberPath = e.PropertyName, //To allow for sorting on a column 
           Binding = new Binding("[" + e.PropertyName + "]") 
       };
    }
    

    视图模型

    private DataTable employeeDataTable;
    
    public DataTable EmployeeDataTable
    {
       get { return employeeDataTable; }
       set
       {
          employeeDataTable = value;
          OnPropertyChanged("EmployeeDataTable");
       }
    }
    
    private void PopulateDataTable()
    {
        var _ds = new DataSet("Test");
        employeeDataTable = new DataTable();
        employeeDataTable = _ds.Tables.Add("DT");
        for (int i = 0; i < 800; i++)
        {
           if(i%2==0)
               employeeDataTable.Columns.Add(i.ToString() + ".");
           else
               employeeDataTable.Columns.Add(i.ToString() + "/");
        }
        for (int i = 0; i < 2; i++)
        {
           var theRow = employeeDataTable.NewRow();
           for (int j = 0; j < 800; j++)
           {
              if (j % 2 == 0)
              {
                //theRow[j] = j.ToString();
                theRow[j] = "a";
              }
              else
                theRow[j] = CreateDoubleValue(j).ToString();
         }
        employeeDataTable.Rows.Add(theRow);
        }
    }
    

    【讨论】:

    • 确实,到目前为止,这是最好的答案(只是在我当前的项目中发现了这个问题)。如果我们需要在列标题中使用任何特殊字符(给定情况下的点、括号),我们应该使用它,DataGrid 不应限制我们。
    猜你喜欢
    • 2016-12-15
    • 2011-01-12
    • 2011-04-13
    • 1970-01-01
    • 2015-07-25
    • 2011-04-10
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多