正在将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"类型。

最好的方法是什么?

正在将IsSelected属性添加到EF POCO

有几种技术可以解决您的问题。我假设您有某种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"。