[英]How to show a list of objects with one extra property (which is not part of the class)?
我首先使用数据库Entity Framework 6开发C#WPF应用程序。 许多类是根据SQL Server数据库的结构自动创建的。
我有一个艺术家班和一个标题班。 如果我只想在WPF中显示“艺术家或标题”列表,则将该列表绑定到可观察到的“艺术家或标题”集合,一切都很好。
但是有时我想显示一个艺术家列表,以及一个额外的字段/属性“选择此”。 即,用户将看到具有Artist类(由EF生成)的所有属性的10位艺术家的列表,此外,我想显示一个复选框,以便用户可以选择每个Artist行。
我想我可以通过基于Artist类创建一个新类,并基于Title类创建另一个新类等来实现此目的。但是,我认为一定有一种更简单的方法可以做到这一点。 但是如何? 有什么建议么?
这就是我们的MVVM的用途。
您应该在EF生成的模型和视图之间使用一个视图模型,在其中可以执行所有此类操作,现在听起来可能很冗长,但是我可以向您保证这是最好的方法。
只是为了在此处回答您的查询,您可以有一个附加的复选框列。 为了那个原因
您可能会询问如何使用从linq查询生成的匿名类型(例如联接查询的结果等)填充dataGrid,这是一个基本示例,其工作方式如下:
首先让我们定义一个dataGrid并将其列绑定到您在匿名类型对象中期望的属性
<DataGrid x:Name="Dg" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Clm1" Binding="{Binding Clm1}"/>
<DataGridTextColumn Header="Clm2" Binding="{Binding Clm2}"/>
<DataGridCheckBoxColumn Header="Clm3" Binding="{Binding Clm3,Mode=OneWay}"/>
</DataGrid.Columns>
</DataGrid>
然后在这里如何使用匿名类型填充该网格
public partial class MainWindow : Window
{
public ObservableCollection<Item> DataGridItems { get; set; }
public MainWindow()
{
InitializeComponent();
DataGridItems=new ObservableCollection<Item>()
{
new Item()
{
Clm1 = "Item1"
}, new Item()
{
Clm1 = "Item2"
}, new Item()
{
Clm1 = "Item3"
}
};
Dg.ItemsSource = DataGridItems.Select((item) =>
new
{
Clm1 = item.Clm1,
Clm2= "Item2",
Clm3=true
}
);
}
}
public class Item
{
public String Clm1 { get; set; }
}
确保使用与dataGrid中相同的Binding属性名称。
EF创建的类都是PARTIAL类,这意味着您可以向它们添加更多属性,并在程序中使用它们而不会影响数据库。
您可以像这样轻松地扩展一个类:
namespace Solution.Project.Model
{
partial class Title
{
public bool IsChecked {get;set;}
}
}
编辑:记住名称空间!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.