【问题标题】:Dot in binding path in WPF causes issueWPF中绑定路径中的点导致问题
【发布时间】:2011-10-15 15:14:17
【问题描述】:

我有一个 DBF 文件读入数据表并在 WPF 中使用数据网格显示。这个 DBF 文件很特殊,它的列名为“A.B”。绑定此列后,绑定表达式可能会将“A”作为数据行视图的属性进行交换,而“B”是“A”的属性。有没有办法解决这个问题?

这是重新创建此问题的代码。只需在 XAML 中有一个 DataGrid 名称“dg”。按F5,第一行应该会显示“Godspeed”,但什么也没有。

DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("A.B");

            DataRow row = dt.NewRow();
            row[0] = 1;
            row[1] = "Godspeed";
            dt.Rows.Add(row);

            DataGridTextColumn colA = new DataGridTextColumn();
            colA = new DataGridTextColumn();
            colA.Binding = new Binding("A.B");
            colA.Header = "A.B";
            dg.Columns.Add(colA);

            var dv = new DataView(
                dt, 
                "", 
                "ID ASC",  
                DataViewRowState.CurrentRows);

            dg.ItemsSource = dv;

下面是我的代码效果截图:

这里是 snoop 监视的表达式异常。所以我确定问题是由绑定路径中的“A.B”点引起的。

System.Windows.Data 错误:40:BindingExpression 路径错误:“A” 在“对象”“DataRowView”(HashCode=60213203)上找不到属性。 绑定表达式:路径=A.B; DataItem='DataRowView' (哈希码=60213203);目标元素是'TextBlock'(名称='');目标 属性是“文本”(输入“字符串”)谢谢,

【问题讨论】:

  • 感谢您的帮助;我仍然在这个问题上挣扎。我们在X64环境;这样我们就不能使用 OleDbProvider 等;所以我们用二进制阅读器来阅读 DBF。上面的代码是重现此问题的简单示例,我不确定从 OleDb 或我们的方法读取是否有任何不同,列类型相同,数据源中的值相同。所以我认为核心问题来自于绑定表达式。请查看我编辑的问题。
  • 奇怪。嗯..您是否尝试过逃避它,例如“A\.B”?
  • "A\.B" 使用是非法的。但我尝试使用 [A.B] 解决了这个问题;但是这样,当点击列标题进行排序时,它会抛出关于 SortMemberPath 的异常,所以我们需要挂钩一个事件来修剪 '[' 和 ']' 使其工作。还是谢谢。
  • 哎呀。没有意识到你已经把方括号放下了。是的,我仍然有排序异常。所以答案还没有完成..
  • 没问题,谢谢你的帮助:)

标签: wpf datagrid binding path


【解决方案1】:

使用方括号。

DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("A.B");

DataRow row = dt.NewRow();
row[0] = 1;
row[1] = "Godspeed";
dt.Rows.Add(row);

dg.AutoGenerateColumns = false;
DataGridTextColumn colA = new DataGridTextColumn();
DataGridTextColumn colB = new DataGridTextColumn();
colA = new DataGridTextColumn();
colB = new DataGridTextColumn();
colA.Binding = new Binding("ID");
colB.Binding = new Binding("A.B");
colA.Header = "ID";
colB.Header = "A.B";
dg.Columns.Add(colA);
dg.Columns.Add(colB);

var dv = new DataView(
    dt,
    "",
    "ID ASC",
    DataViewRowState.CurrentRows);

dg.ItemsSource = dv;

但是排序会抛出异常

【讨论】:

  • 是的,看到我的赞扬,我们几乎同时解决了这个问题。 :)。
【解决方案2】:

加上 KMC 的回答,您可能会遇到排序异常。请在 DataGrid 上挂钩“排序”事件并修剪 e.Column.SortMemberPan 的 '[' 和 ']' 将解决此问题。

【讨论】:

  • 在我看来,单元格中的值更新有类似的问题。当调用提交时,我的应用程序因对象引用实例异常和堆栈输出而崩溃,例如:在 System.Windows.Data.BindingGroup.UpdateAndValidate(ValidationStep validationStep) 在 System.Windows.Data 的 System.Windows.Data.BindingGroup.UpdateValues() .BindingGroup.CommitEdit() 有没有类似的问题?
猜你喜欢
  • 2014-06-03
  • 2022-01-22
  • 2013-05-09
  • 2014-12-02
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
相关资源
最近更新 更多