如何显示 objects 的列表和一个额外的 属性(它不是 class 的一部分)?
How to show a list of objects with one extra property (which is not part of the class)?
我正在开发一个 C# WPF 应用程序 Entity Framework 6,数据库优先。许多 class 是根据 SQL 服务器数据库的结构自动创建的。
我有一个 class 艺术家和一个 class 标题。如果我只想在 WPF 中显示一个艺术家或标题列表,我将该列表绑定到一个可观察到的 collection 艺术家或标题,一切都很好。
但有时我想展示一个艺术家列表加上一个额外的 field/property “Select This”。 IE。用户将看到 10 位艺术家的列表,其中包含艺术家 class(由 EF 生成)的所有属性,另外我想显示一个复选框,以便用户可以 select 每个艺术家行。
我想我可以通过创建一个基于艺术家 class 的新 class 和另一个基于标题 class 的新 class 等来做到这一点。但不知何故我认为必须是一种更简单的方法来做到这一点。但是怎么办?有什么建议吗?
这就是我们拥有 MVVM 的目的..
您应该在 EF 生成的模型和视图之间有一个视图模型,您可以在其中进行所有此类操作,现在听起来可能很长,但我可以向您保证这是前进的最佳方式。
为了在这里回答您的查询,您可以有一个额外的复选框列。为此
- 您需要在 UI、
上使用 DataGrid
- 在网格中有一个复选框列,
- 将选中的每个复选框绑定到 command/eventhandler..
- 把物品拿到那儿玩。
您可能会问如何使用从 linq 查询生成的匿名类型填充数据网格,例如连接查询的结果等,这里是一个基本示例:
首先 让我们定义一个 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; }
}
确保使用与数据网格中相同的绑定 属性 名称。
EF 创建的classes 都是PARTIAL classes,这意味着您可以向它们添加更多属性并在您的程序中使用它们而不影响DB。
您可以像这样轻松扩展 class:
namespace Solution.Project.Model
{
partial class Title
{
public bool IsChecked {get;set;}
}
}
编辑:
记住命名空间!
我正在开发一个 C# WPF 应用程序 Entity Framework 6,数据库优先。许多 class 是根据 SQL 服务器数据库的结构自动创建的。
我有一个 class 艺术家和一个 class 标题。如果我只想在 WPF 中显示一个艺术家或标题列表,我将该列表绑定到一个可观察到的 collection 艺术家或标题,一切都很好。
但有时我想展示一个艺术家列表加上一个额外的 field/property “Select This”。 IE。用户将看到 10 位艺术家的列表,其中包含艺术家 class(由 EF 生成)的所有属性,另外我想显示一个复选框,以便用户可以 select 每个艺术家行。
我想我可以通过创建一个基于艺术家 class 的新 class 和另一个基于标题 class 的新 class 等来做到这一点。但不知何故我认为必须是一种更简单的方法来做到这一点。但是怎么办?有什么建议吗?
这就是我们拥有 MVVM 的目的..
您应该在 EF 生成的模型和视图之间有一个视图模型,您可以在其中进行所有此类操作,现在听起来可能很长,但我可以向您保证这是前进的最佳方式。
为了在这里回答您的查询,您可以有一个额外的复选框列。为此
- 您需要在 UI、 上使用 DataGrid
- 在网格中有一个复选框列,
- 将选中的每个复选框绑定到 command/eventhandler..
- 把物品拿到那儿玩。
您可能会问如何使用从 linq 查询生成的匿名类型填充数据网格,例如连接查询的结果等,这里是一个基本示例:
首先 让我们定义一个 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; }
}
确保使用与数据网格中相同的绑定 属性 名称。
EF 创建的classes 都是PARTIAL classes,这意味着您可以向它们添加更多属性并在您的程序中使用它们而不影响DB。
您可以像这样轻松扩展 class:
namespace Solution.Project.Model
{
partial class Title
{
public bool IsChecked {get;set;}
}
}
编辑: 记住命名空间!