繁体   English   中英

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

[英]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生成的模型和视图之间使用一个视图模型,在其中可以执行所有此类操作,现在听起来可能很冗长,但是我可以向您保证这是最好的方法。

只是为了在此处回答您的查询,您可以有一个附加的复选框列。 为了那个原因

  • 您需要在UI上使用DataGrid,
  • 在网格中有一个复选框列,
  • 将选中的每个复选框绑定到命令/事件处理程序。
  • 把物品拿到那里玩。

您可能会询问如何使用从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM