2
先決條件:.Net框架4.5.1顯示名稱未顯示
我使用ITypedList
和ICustomTypeDescriptor
使DataGrid
動態生成列。爲了提供用戶友好的列名,我創建了屬性描述符,如下面的例子所示,爲它的構造函數提供DisplayNameAttribute
。雖然調試器顯示PropertyDescriptor.DisplayName
屬性獲取我在屬性DataGrid
中提供的屬性並沒有考慮到該值,仍然顯示屬性名稱而不是屬性display name。任何想法我做錯了什麼?
例WDataGridTest.xaml
<Window x:Class="Local.WGridViewTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:l="clr-namespace:Local"
Title="WGridViewTest" Height="300" Width="300">
<Window.Resources>
<l:DataTable x:Key="DataTable"/>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{StaticResource ResourceKey=DataTable}"/>
</Grid>
</Window>
背後WDataGridTest.xaml.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows;
using System.ComponentModel;
namespace Local {
/// <summary>Interaction logic for WGridViewTest.xaml</summary>
public partial class WGridViewTest : Window {
public WGridViewTest() {
InitializeComponent();
}
}
public class DataTable : BindingList<DataRow>, ITypedList {
private PropertyDescriptorCollection _PropertyDescriptors;
public DataTable() :
base() {
AllowNew = false;
AllowRemove = false;
AllowEdit = true;
_PropertyDescriptors = new PropertyDescriptorCollection(new PropertyDescriptor[0], false);
_PropertyDescriptors.Add(new DataValuePropertyDescriptor("Column1"));
_PropertyDescriptors.Add(new DataValuePropertyDescriptor("Column2"));
_PropertyDescriptors.Add(new DataValuePropertyDescriptor("Column3"));
Items.Add(new DataRow(this));
Items.Add(new DataRow(this));
Items.Add(new DataRow(this));
Items.Add(new DataRow(this));
Items.Add(new DataRow(this));
}
#region ITypedList implementation
public PropertyDescriptorCollection GetItemProperties(PropertyDescriptor[] ListAccessors) {
return _PropertyDescriptors;
}
public string GetListName(PropertyDescriptor[] ListAccessors) {
return "Data Table";
}
#endregion ITypedList implementation
}
public class DataRow : ICustomTypeDescriptor {
public DataRow(DataTable DataTable) {
this.DataTable = DataTable;
}
public DataTable DataTable {
get;
private set;
}
public object GetValue(string ColumnName) {
return String.Concat(ColumnName, "@", GetHashCode());
}
public void SetValue(string ColumnName, object Value) {
}
#region ICustomTypeDescriptor implementation
public AttributeCollection GetAttributes() { return AttributeCollection.Empty; }
public string GetClassName() { return GetType().FullName; }
public string GetComponentName() { return GetType().Name; }
public TypeConverter GetConverter() { return null; }
public EventDescriptor GetDefaultEvent() { return null; }
public PropertyDescriptor GetDefaultProperty() { return null; }
public object GetEditor(Type EditorBaseType) { return null; }
public EventDescriptorCollection GetEvents(Attribute[] Attributes) { return EventDescriptorCollection.Empty; }
public EventDescriptorCollection GetEvents() { return EventDescriptorCollection.Empty; }
public PropertyDescriptorCollection GetProperties(Attribute[] Attributes) { return DataTable.GetItemProperties(null); }
public PropertyDescriptorCollection GetProperties() { return DataTable.GetItemProperties(null); }
public object GetPropertyOwner(PropertyDescriptor PropertyDescriptor) { return this; }
#endregion Property value tracking
}
public class DataValuePropertyDescriptor : PropertyDescriptor {
public DataValuePropertyDescriptor(string Name) :
base(Name, new Attribute[] { new DisplayNameAttribute(String.Concat("Display: ", Name)) }) {
}
#region PropertyDescriptor implementation
public override Type ComponentType { get { return typeof(DataRow); } }
public override Type PropertyType { get { return typeof(string); } }
public override bool IsReadOnly { get { return false; } }
public override bool CanResetValue(object DataRow) { return true; }
public override object GetValue(object DataRow) { return ((DataRow)DataRow).GetValue(Name); }
public override void ResetValue(object DataRow) { ((DataRow)DataRow).SetValue(Name, null); }
public override void SetValue(object DataRow, object Value) { ((DataRow)DataRow).SetValue(Name, Value); }
public override bool ShouldSerializeValue(object DataRow) { return false; }
#endregion PropertyDescriptor implementation
}
}
代碼工作正常,我用4.0 – jHilscher
@jHilscher,試圖4.0,看到同樣的結果,沒有顯示名稱。你嘗試過我的示例,還是你的代碼有用? –
我只是複製/粘貼你的樣本。 – jHilscher