我需要修改每个列标题的名称以反映每个列的单位。当前,我的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一样,绑定到整个集合本身。
有没有简单或好的方法来实现这一目标?
答案 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 = $"
({UnitStrings[e.PropertyType]})";
}
结果: