如何显示具有一个额外属性的对象列表(不属于该类)?

时间:2015-04-08 09:34:38

标签: c# .net wpf entity-framework listview

我正在开发一个带有Entity Framework 6的C#WPF应用程序,数据库优先。根据SQL Server数据库的结构自动创建许多类 我有一个艺术家类和一个班级标题。如果我只是想在WPF中显示一个艺术家或标题列表,我将列表绑定到一个可观察的艺术家或标题集合,一切都很好。
但有时我想展示艺术家名单加上额外的字段/属性“选择此项”。即用户将看到10个艺术家的列表,其中包含Artist类的所有属性(由EF生成),另外我想显示一个复选框,以便用户可以选择每个艺术家行。
我想我可以通过创建一个基于Artist类的新类和另一个基于Title类的新类等来实现这一点。但不知何故,我认为必须有一个更简单的方法来做到这一点。但是怎么样?有什么建议吗?

3 个答案:

答案 0 :(得分:2)

这就是我们拥有MVVM的原因..

你应该在EF Generated模型和视图之间有一个视图模型,你可以在其中进行所有这些操作,现在听起来可能很冗长,但我可以向你保证它是最好的方式。

只是在这里回答您的问题,您可以有一个额外的复选框列。那个

  • 您需要在UI上使用DataGrid,
  • 网格中有一个复选框列
  • 将选中的每个复选框绑定到命令/ eventhandler ..
  • 在那里拿到物品并玩它。

答案 1 :(得分:1)

您可能会询问如何使用从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属性名称。

答案 2 :(得分:1)

EF创建的类都是PARTIAL类,这意味着您可以向它们添加更多属性并在程序中使用它们而不会影响数据库。

您可以轻松扩展这样的类:

namespace Solution.Project.Model
{
  partial class Title
  {
    public bool IsChecked {get;set;}
  }
}

修改 记住命名空间!