涉及数据显示的极其奇怪的问题

时间:2013-04-16 14:49:59

标签: c# .net wpf xaml user-interface

我有一个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。这是它的显示方式,即正确的行数但没有数据:

enter image description here

我使用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')

3 个答案:

答案 0 :(得分:4)

这里的问题是列标题中涉及标点符号。删除标点符号解决了这个问题。希望有同样问题的人会读到这个,因为我花了很多时间才意识到这一点。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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