【问题标题】:Datagrid column header values are missing缺少 Datagrid 列标题值
【发布时间】:2013-05-31 19:54:53
【问题描述】:

初学者问题。我在我的 WPF 表单中关注了XAML

    <DataGrid x:Name="GridTable" 
              ItemsSource="{Binding GridDataSource}" 
              HorizontalGridLinesBrush="#FFE2E2E2" 
              VerticalGridLinesBrush="#FFE2E2E2" 
              CanUserAddRows="False" 
              CanUserResizeColumns="True" 
              Margin="10,140,214,10" 
              SelectionChanged="GridTableSelectionChanged" >

        <DataGrid.Columns>
            <DataGridCheckBoxColumn Header="{Binding Selection}" ></DataGridCheckBoxColumn>
            <DataGridTextColumn Header="{Binding XmlFile}"></DataGridTextColumn>
            <DataGridTextColumn Header="{Binding Result}"></DataGridTextColumn>
        </DataGrid.Columns>

        <DataGrid.Resources>
            <Style TargetType="DataGridCell">
                <Setter Property="BorderThickness" Value="0"/>
                <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            </Style>
        </DataGrid.Resources>

    </DataGrid>

ViewModel 代码

    public string Selection
    {
        get { return "Selection"; }
    }

    public string XmlFile
    {
        get { return "Xml File"; }
    }

    public string Result
    {
        get { return "Result"; }
    }

    private DataTable CreateDataSource()
    {
        var dt = new DataTable();

        var dc = new DataColumn(Selection, typeof(bool));
        dt.Columns.Add(dc);

        dc = new DataColumn(XmlFile, typeof(string));
        dt.Columns.Add(dc);

        dc = new DataColumn(Result, typeof(string));
        dt.Columns.Add(dc);

        return dt;
    }

在其中填充数据后,我正在使用此数据表作为我的网格的源。

我希望当我运行我的应用程序时,我应该能够看到一个包含 3 列的数据网格,其标题为 SelectionXmlFileResult,作为每个绑定值。但我看到的只是没有列的网格。谁能帮我理解这有什么问题?

我还想将数据源GridDataSource 附加到网格。该数据表有 3 列与网格列和一些相关数据同名。当我在数据表中加载一些数据并通知它查看时,我看到已经存在 3 个空列,然后是我的数据表的更多 3 列。谁能帮我理解我的代码有什么问题。如果您需要更多信息,请告诉我。

编辑

我还注意到,当我的 AutoGenerateColumns 标记设置为 true 时,我会在 DataGrid 中看到我的数据表的另外 3 列以及 3 个空列。而当 AutoGenerateColumns` 标签设置为 false 时,我看不到任何数据,只看到 3 个空列。

【问题讨论】:

  • 你能发布底层虚拟机吗?您是否在调试窗口中收到任何 BindingExpression 错误?
  • 查看编辑....出去吃午饭一个小时 :)
  • 享用午餐 - BindingExpression 错误是怎么回事?
  • 调试时我没有收到任何错误......

标签: .net wpf xaml wpf-controls wpfdatagrid


【解决方案1】:

当前您正在绑定 DataGridColumn.Header,这意味着您的 GridDataSource 应该公开 3 个属性(SelectionXmlFileResult)以显示在列标题中,而不是值中。如果我了解您的问题和数据模型,我认为您要绑定的是Binding,而不是Header

<DataGrid.Columns>
   <DataGridCheckBoxColumn Header="Selection" Binding="{Binding Selection}"/>
   <DataGridTextColumn Header="XmlFile" Binding="{Binding XmlFile}"/>
   <DataGridTextColumn Header="Result" Binding="{Binding Result}"/>
</DataGrid.Columns>

DataGrid 也有 AutoGenerateColumns 选项,这可能在这里有用,它将根据附加的数据源自动为您创建列,因此您不必手动指定 DataGrid.Columns

<DataGrid AutoGenerateColumns="True" ..../>

【讨论】:

  • 我认为没有......我正在尝试将标题文本绑定到 ViewModel 中的属性。现在,我再次尝试将网格的数据源绑定到数据表。由于我想使用datagrid的现有列,所以我准备了具有相同列名的datatble,以便绑定成功。
  • 从技术上讲,当绑定 DataGridCheckBoxColumn 时,我需要在 ViewModel 中使用 DataRowView,但我现在只有一个字符串。而我将所有数据都放在数据表中。
  • 但是自动生成列将满足您的需求。它将绑定数据并为您创建列标题。 Here 是我的简单示例,它将从我的模型视图绑定到 DataTable 并自动生成列。由于您的列标题是在您的属性的创建点设置的,因此您不必再次绑定它。
  • 我已经做到了。现在我想使用静态数据列而不是动态数据列。它将帮助我定义列的宽度、列单元格的颜色等。是否可以使用动态列来做到这一点?
猜你喜欢
  • 2011-01-21
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多