【问题标题】:WPF DataGrid custom header widths when auto-generated自动生成时的 WPF DataGrid 自定义标题宽度
【发布时间】:2018-02-14 11:56:00
【问题描述】:

我是 WPF 新手,但我有一些开发方面的经验。我已经尝试了很多选择来让它工作,但我很难过......

我想要一个包含两列的简单 DataGrid; “名称”和“计数”。

我希望“名称”的宽度为 *(剩余可用),“计数”的宽度为 50,锁定在右边缘。

我希望这个 DataGrid 控件所在的 Grid 单元格可以调整大小(DataGrid 的水平对齐和垂直对齐都设置为“拉伸”)。在调整网格单元格大小时,我希望左侧的“名称”列扩展或收缩以填充右侧 50 宽的“计数”列留下的可用空间。

DataGrid 通过 ItemSource 填充自定义 SortableBindingList 列表,其中 MyListObj 有两个字符串属性“Name”和“Count”。

如果我尝试在 XAML () 中定义列,则在设置 ItemSource 时会得到四列。

我已经尝试过 XAML 中的资源、样式和模板(在此处找到类似问题的各种答案和示例,codeproject 和 MSDN)并在代码中明确设置值。

我得到的最接近的是在加载 DataGrid 时在代码中设置:

MyDataGrid.Loaded += (s, o) =>
{
  if (MyDataGrid.Columns.Count() == 2)
  {
    MyDataGrid.Columns[0].Width = new DataGridLength(1,DataGridLengthUnitType.Star);
    MyDataGrid.Columns[1].Width = 50;
  }
};

在这种情况下,我将左侧调整大小的“名称”列和右侧的“计数”列锁定并固定,但我在两列之间获得了 50 像素的空间(幻影第 3 列?我不知道那个是从哪里来的!)。

如果我在 XAML 中设置标头和数据,这非常容易,但当然,数据是动态的并且通过 ItemSource 设置,所以在这种情况下不是一个选项。还是不知何故?

这把我逼疯了!有什么想法吗?

【问题讨论】:

  • 不确定您的真正问题是什么。但是我感觉你没有设置AutoGenerateColumns = false。否则,您将获得两倍于您拥有属性的列数。
  • 我觉得自己像个白痴,但仅此而已。谢谢!

标签: .net wpf datagrid


【解决方案1】:

处理AutoGeneratedColumns 事件:

private void dg_AutoGeneratedColumns(object sender, EventArgs e)
{
    dg.Columns[0].Width = new DataGridLength(1, DataGridLengthUnitType.Star);
    dg.Columns[1].Width = new DataGridLength(50, DataGridLengthUnitType.Pixel);
}

XAML:

<DataGrid x:Name="dg" AutoGeneratedColumns="dg_AutoGeneratedColumns" />

或者将DataGridAutoGenerateColumns 属性设置为false,并在XAML 标记中明确定义列。

<DataGrid x:Name="dg" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" Width="*" />
        <DataGridTextColumn Binding="{Binding Count}" Width="50" />
    </DataGrid.Columns>
</DataGrid>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2014-03-12
    相关资源
    最近更新 更多