你可以使用一个可绑定的动态字典。这将把每个字典条目公开为一个属性。
public sealed class BindableDynamicDictionary : DynamicObject, INotifyPropertyChanged
{
private readonly Dictionary<string, object> _dictionary;
public BindableDynamicDictionary()
{
_dictionary = new Dictionary<string, object>();
}
public BindableDynamicDictionary(IDictionary<string, object> source)
{
_dictionary = new Dictionary<string, object>(source);
}
public object this[string key]
{
get
{
return _dictionary[key];
}
set
{
_dictionary[key] = value;
RaisePropertyChanged(key);
}
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return _dictionary.TryGetValue(binder.Name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
_dictionary[binder.Name] = value;
RaisePropertyChanged(binder.Name);
return true;
}
public override IEnumerable<string> GetDynamicMemberNames()
{
return _dictionary.Keys;
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
var propChange = PropertyChanged;
if (propChange == null) return;
propChange(this, new PropertyChangedEventArgs(propertyName));
}
}
然后你可以像这样使用它:
private void testButton1_Click(object sender, RoutedEventArgs e)
{
var dd = new BindableDynamicDictionary();
dd["Age"] = 32;
dynamic person = dd;
person.FirstName = "Alan";
person.LastName = "Evans";
var collection = new ObservableCollection<object>();
collection.Add(person);
dataGrid1.ItemsSource = collection;
}
Datagrid需要定制代码来创建列:
XAML:
<DataGrid AutoGenerateColumns="True" Name="dataGrid1" AutoGeneratedColumns="dataGrid1_AutoGeneratedColumns" />
自动生成列事件:
private void dataGrid1_AutoGeneratedColumns(object sender, EventArgs e)
{
var dg = sender as DataGrid;
var first = dg.ItemsSource.Cast<object>().FirstOrDefault() as DynamicObject;
if (first == null) return;
var names = first.GetDynamicMemberNames();
foreach(var name in names)
{
dg.Columns.Add(new DataGridTextColumn { Header = name, Binding = new Binding(name) });
}
}
Person
类,并为所有你需要显示的其他项目创建类(而不是使用Dictionary<>
)? - Sphinxxx