如何从每列+ WPF

时间:2018-07-10 23:03:00

标签: c# wpf datagrid

我需要修改每个列标题的名称以反映每个列的单位。当前,我的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"/>

ObjectList

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

我不希望在xaml中绑定集合中的每种类型。我希望像上面的xaml一样,绑定到整个集合本身。

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

1 个答案:

答案 0 :(得分:0)

出于性能考虑,我将每种类型的静态映射声明为要显示的格式字符串:

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 = $"enter image description here ({UnitStrings[e.PropertyType]})";
}

结果:

Finder contextual menu