DataGrid'无数据'行:BindingExpression路径错误

时间:2012-01-05 10:03:25

标签: c# .net wpf binding datagrid

我在.Net3.5中使用DataGrid来显示用户可以切换的几种不同的数据源。每个数据源都使用一个新的DataGrid,但它背后的代码对所有数据都是通用的,因此不知道数据的真实内容。 DataGrid的ItemsSource中对象的标题和绑定由XML文件控制,该文件在首次创建DataGrid时生成链接。

我还解决了DataGrid中没有行导致水平滚动条消失的问题。这是因为我需要用户仍然能够滚动标题以删除那里可能导致缺少结果的过滤器。这一切都是通过一个转换器完成的,如果它看到当前绑定的集合没有返回任何行,则会添加一个EmptyRow的集合。

我的问题是这个EmptyRow不包含标准行所保存的属性,因此每当它被添加到DataGrid时,显然存在绑定路径错误,即使这些错误不会阻止将该行添加为空白行。

尽管如此,如果有人能指出我正确的方向,我宁愿不解决约束问题。

更新 - 转换器始终返回一行

public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
    if (values.Length == 2 && values[1] != null)
    {
        bool isEmpty;
        if (bool.TryParse(values[1].ToString(), out isEmpty) && isEmpty)
        {
            return new List<EmptyRow> {new EmptyRow()};
        }
    }
    return values.FirstOrDefault();
}

包含当前集合以及该集合的IsEmpty属性。如果集合为空,则返回一个EmptyRow而不是空集合的集合。这是通用DataGrid的转换器,原始集合可以是几种集合类型之一。因此,我总是遇到绑定问题,因为EmptyRow不满足DataGrid设置期望的属性。

1 个答案:

答案 0 :(得分:0)

按照上次评论更新。

我可以在这里看到两个选项:

  1. 为所有对象创建一个不同的属性名称列表,并将它们添加到EmptyRow中。听起来很讨厌 - 但它会起作用。这样你就可以得到一个通用的对象。缺点是,无论何时修改实际对象,都需要保持EmptyRow的最新状态。

  2. 将您的对象更改为expandos,而不是

    字符串PropertyName {   得到;   得到; }

  3. 有一个索引器:

    object Property[string propertyName]
    {
      get { ... }
      set { ... }
    }
    

    有了这个,你总能为一个未知的财产返回一些东西。这将迫使您为每个值使用Converter。