需要在DataGrid中展示不同Model的数据,可以将DataGrid的AutoGenerateColumns属性设置为"True",让列自动生成即可,但是列名字就会默认为属性名字,给用户看不合适,则可以通过对属性添加Description来保存列名字。
1.对Model属性增加Description
需要展示的写Description,不需要的就不写,在下面会通过是否有Description来控制在DataGrid是否展示。
public class DataModel
{
[Description("序号")]
public int Index { get; set; }
[Description("名字")]
public string name { get; set; }
public string comment{ get; set; }
}
2.在ViewModel中增加DataGrid绑定的数据对象
public class DataViewModel
{
private ObservableCollection<object> items = new ObservableCollection<object>();
public ObservableCollection<object> Items
{
get { return items ; }
set { items = value; }
}
}
3.在XAML中增加DataGrid
DataGrid有一个AutoGeneratingColumn事件,在生成Column会触发这个事件,然后通过判断属性的Description是否有值来控制是否显示。
<DataGrid x:Name="fileList" SelectionMode="Extended" AutoGenerateColumns="True"
AutoGeneratingColumn="fileList_AutoGeneratingColumn"
ScrollViewer.HorizontalScrollBarVisibility="Auto" VerticalAlignment="Stretch"
ItemsSource="{Binding Items}">
private void fileList_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (string.IsNullOrEmpty((e.PropertyDescriptor as System.ComponentModel.PropertyDescriptor).Description))
{
e.Column.Visibility = Visibility.Collapsed;
}
else
{
e.Column.Header = Strings.GetString((e.PropertyDescriptor as System.ComponentModel.PropertyDescriptor).Description);
}
}
4.增加数据
对ViewModel中的Items增加数据,则前台可以显示出数据。
5.切换不同数据类型
切换不同数据类型的时候DataGrid并不会自动删除列,所以需要手动删除之前的数据,并且重置一下AutoGenerateColumns 属性,我是增加了一个Combox类控制数据来源,当Combox切换时触发删除DataGrid数据。
<ComboBox ItemsSource="{Binding EventTypeEnumItems}"
SelectionChanged="ComboBox_SelectionChanged"
SelectedValue="{Binding EventType,Mode=TwoWay}" Width="245"/>
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.fileList.Columns.Clear();
this.DataViewModel.Items.Clear();
this.fileList.AutoGenerateColumns = false;
this.fileList.AutoGenerateColumns = true;
}