在WPF中,一般使用MVVM模式,第一个M为数据显示的模型,一般一个ListView显示对应一个Model,一个ComboBox显示对应一个Model等,需要建立很多Model.
有时候,我们只是在界面显示一次性信息,不需要进行双向绑定、通知更新,这个时候,我们可以使用匿名类来绑定,不需要重新建立Model.
先看我们一般的方法:
建立一个People的Model:
public class People
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
绑定到ListView:
<ListView Name="listView" SelectionChanged="listView_SelectionChanged" SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Header="姓名" Width="100" DisplayMemberBinding="{Binding Name}"></GridViewColumn>
<GridViewColumn Width="100" Header="年龄" DisplayMemberBinding="{Binding Age}"></GridViewColumn>
</GridView>
</ListView.View>
</ListView>
运行结果:
现在使用匿名类来显示数据,此时,我们没有用到People类:
var list = new List<object>()
{
new {Id=0,Name="li",Age=22},
new {Id=1,Name="li1",Age=22},
new {Id=2,Name="l2",Age=22},
new {Id=3,Name="l3",Age=22},
new {Id=4,Name="li4",Age=22},
new {Id=5,Name="li5",Age=22},
};
this.listView.ItemsSource = list;
listView_SelectionChanged事件中的处理代码是通用的,不变:
if (e.AddedItems == null || e.AddedItems.Count == 0)
return;
object selectedItem = e.AddedItems[0];
this.tbMsg.Text = string.Format("ID:{0} Name:{1} Age:{2}",
selectedItem.GetType().GetProperty("Id").GetValue(selectedItem, null),
selectedItem.GetType().GetProperty("Name").GetValue(selectedItem, null),
selectedItem.GetType().GetProperty("Age").GetValue(selectedItem, null));
运行结果如下:
匿名类的类型比较特殊,但是任何类型都是继承自Object的,我们使用匿名类的时候,对于匿名类对象中有哪些属性,需要做到“心知肚明”,否则容易出错。这种方法使用到了反射,性能会有所降低。