【问题标题】:How to retrieve Data Type from DataGrid of each column + WPF如何从每列的DataGrid中检索数据类型+ WPF
【发布时间】:2018-12-18 21:05:22
【问题描述】:

我需要修改每个列标题的名称以反映每列的单位。目前,我的 DataGrid 绑定到一个包含各种属性的列表。加载数据网格时,每列的标题应采用这种格式“HeaderName(单位)”。我很难检索我的财产类型以显示单位。如何从 DataGrid 中获取每列的类型?
现在我正在硬编码如下,如果我知道类型,我可以检索这些单元而无需硬编码。

private void DataGrid_Loaded(object sender, RoutedEventArgs e)
 {
   dg.Columns[0].Header = dg.Columns[0].Header + "(m/s)"; //=> Speed (m/s)
   dg.Columns[1].Header = dg.Columns[1].Header + "(s)"; //=> Duration (s)
   ...
   dg.Columns[7].Header = dg.Columns[7].Header + "(s)"; //=> Duration (s)

 }

我的示例 xaml:

<DataGrid  ItemsSource="{Binding Path=ObjectList}"                    
                      SelectionMode="Single" Name="dg" Loaded="DataGrid_Loaded"/>

对象列表

public class ObjectList
{
    public Speed Speed { get; set; }
    public Time Duration { get; set; }
    public Ampere Current { get; set; }
    ... (almost 8 properties)
}

我不喜欢在 xaml 中绑定集合中的每种类型。我想像上面的 xaml 一样保持与整个集合本身的绑定。

有没有简单或好的方法来实现这一点?

【问题讨论】:

标签: c# wpf datagrid


【解决方案1】:

为了提高性能,我将每种类型的静态映射声明为您要显示的格式字符串:

private static Dictionary<Type, string> UnitStrings = new Dictionary<Type, string>
{
    {typeof(double), "m/s"},
    {typeof(int), "s"}
};

另外我假设你问这个问题是因为你在自动生成你的列,在这种情况下 AutoGeneratingColumn 是一个更好的事件处理程序:

<DataGrid ItemsSource="{Binding MyItems}" AutoGeneratingColumn="OnAutoGeneratingColumn" />

那么只需在处理程序中进行字典查找即可:

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (UnitStrings.ContainsKey(e.PropertyType))
        e.Column.HeaderStringFormat = $"{{0}} ({UnitStrings[e.PropertyType]})";
}

结果:

【讨论】:

  • 像魅力一样工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2017-12-20
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
相关资源
最近更新 更多