1

我有一个 DataGrid,定义如下:

 <DataGrid Name="dgResults" 
                  IsReadOnly="True"
                  AutoGenerateColumns="True"
                  AllowDrop="False"
                  CanUserAddRows="False"
                  CanUserDeleteRows="False"
                  CanUserReorderColumns="True"
                  CanUserResizeColumns="True"
                  CanUserResizeRows="False"
                  CanUserSortColumns="False"
                  ColumnWidth="120"
                  Margin="15,10,10,10"
                  Visibility="Collapsed" 
                  ItemsSource="{Binding}"/>

出于某种原因,绑定到它时没有显示任何数据。正在显示正确数量的行,但它们都是空的。这是我的代码:

dgResults.DataContext = dtTopTwoHundredResults.AsDataView();
dgResults.AutoGeneratingColumn += new EventHandler<DataGridAutoGeneratingColumnEventArgs>(dataGrid_AutoGeneratingColumn);
dgResults.Visibility = Visibility.Visible;

private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            //Sets the DataGrid's headers to be TextBlocks, which solves a problem whereby underscore characters in the header are ignored.
            TextBlock block = new TextBlock();
            block.Text = e.Column.Header.ToString();
            e.Column.Header = block;
        }

这绝对不是数据源的问题,因为数据应该包含在其中。它只是DataGrid。这是它的显示方式,即正确的行数但没有数据:

在此处输入图像描述

我使用 Snoop 来确定文本是否实际包含在 DataGrid 中,我得到了这个:

System.Windows.Data Error: 40 : BindingExpression path error: 'Employee identification number' property not found on 'object' ''DataRowView' (HashCode=51298929)'. BindingExpression:Path=Employee identification number. Foreign key to Employee.BusinessEntityID.; DataItem='DataRowView' (HashCode=51298929); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Error: 40 : BindingExpression path error: 'Employee identification number' property not found on 'object' ''DataRowView' (HashCode=51298929)'. BindingExpression:Path=Employee identification number. Foreign key to Employee.BusinessEntityID.; DataItem='DataRowView' (HashCode=51298929); target element is 'PropertyInformation' (HashCode=11239682); target property is 'Value' (type 'Object')
4

3 回答 3

4

这里的问题是标点符号包含在列标题中。删除标点符号解决了这个问题。希望有同样问题的人会读到这篇文章,因为我花了好几个小时才意识到。

于 2013-04-16T16:56:30.720 回答
0

从您的代码来看,您似乎只需要自定义列标题。如果是这样,您可能希望在 XAML 中明确定义列:

<DataGrid.Columns>
    <DataGridTextColumn Header="Employee identification number"
                        Binding="{Binding Path=EmployeeID}"
    </DataGridTextColumn>
    <Insert other column definitions here/>
</DataGrid.Columns>

您现在拥有它的方式,似乎 XAML 解析器(或其他)正在寻找与列标题(或类似内容)中的内容匹配的属性名称,并且它没有在您的 ItemsSource 对象上找到匹配的属性列标题。

于 2013-04-16T15:35:33.883 回答
0

您可以像这样显式设置您的数据网格列,此时您的数据网格的问题在于它可以显示的内容是有限的,因为标题是显式设置的。问题是,当您在 autogeneratedColumn 事件处理程序中设置标题时,文本块会像您说的那样忽略下划线,但此时 wpf 不知道如何将列数据绑定到该标题。这就是绑定路径出错的原因。“员工标识号”是它试图绑定回您的数据视图的内容,但在您的数据视图中是“员工标识号”。下面的解决方案解决了您的问题,但将您限制为仅显示该特定数据视图。如果那不是问题,那么这就是您的解决方案。

<DataGrid.Columns>
 <DataGridTextColumn Header="Employee identification number"
                    Binding="{Binding Path=EmployeeID}"
</DataGridTextColumn>
<Insert other column definitions here/>
</DataGrid.Columns>
于 2013-04-16T15:52:03.500 回答