正在将IsSelected属性添加到EF POCO
本文关键字:EF POCO 添加 属性 IsSelected | 更新日期: 2023-09-27 18:20:40
我有一个WCF服务,它使用EF将数据传递给我的Silverlight应用程序。我需要让用户从绑定到ObservableCollection<SHOP>
的组合框中选择多个项目。我正在尝试将IsSelected属性添加到Silverlight端的POCO中,以跟踪选择了哪些项目。
我创建了一个名为SHOPSelect的类,它继承自SHOP,并添加了一个IsSelected属性。然后,我将绑定到我的组合框的列表更改为该类型。
我的问题是试图将WCF中的数据作为ObservableCollection<SHOP>
获取,并将其转换为我的扩展类ObservableCollection<SHOPSelect>
的列表。我可以使用它来编译代码,但在调试时,尝试将SHOP强制转换为SHOPSelect时会引发异常。
Main.ShopList = new ObservableCollection<SHOPSelect>(e.Result.Cast<SHOPSelect>());
例外情况是:
无法将"SHOP"类型的对象强制转换为"SHOPSelect"类型。
最好的方法是什么?
有几种技术可以解决您的问题。我假设您有某种SelectionMode="Multiple"或"Extended"的列表框,您需要跟踪所选内容。有时我不得不通过在列表框中显示复选框来做到这一点。
首先,对于您手头的问题,以这种方式构建一个新的可观察集合(您需要在SHOPSelect中使用SHOP:的构造函数
Main.ShopList = new ObservableCollection<SHOPSelect>(
from shop in e.Result select new SHOPSelect(shop));
另一种技术是使用分部类来定义IsSelected。
public partial class SHOP
{
public bool IsSelected {get; set;}
}
另一种技术是重新设计ListBoxItemContainer的样式。Microsoft使用的默认模板如下:http://msdn.microsoft.com/en-us/library/cc278062(v=VS.95).aspx通过替换修改ListBoxItem样式
<ContentPresenter
x:Name="contentPresenter"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"/>
带有
<CheckBox x:Name="contentControl"
IsHitTestVisible="False" VerticalAlignment="Center"
HorizontalAlignment="Left" Margin="6,0,0,0"
IsChecked="{TemplateBinding IsSelected}">
<ContentPresenter Margin="6,0,0,0"
x:Name="contentPresenter"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
VerticalAlignment="Center"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
</CheckBox>
与其继承新类型,不如扩展现有类型(分部类),添加自己的"silverlight only"属性-在本例中为"IsSelected"。