将IsSelected属性添加到EF POCO

时间:2012-01-16 21:05:13

标签: c# silverlight wcf inheritance casting

我有一个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”。

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

有几种技术可以解决您的问题。我假设您有某种列表框,其中SelectionMode =“Multiple”或“Extended”,您需要跟踪所选内容。我有时必须在列表框中显示复选框。

首先,对于您手头的问题,以这种方式构建一个新的可观察集合(您需要一个SHOPSelect中的构造函数,它需要一个SHOP:

Main.ShopList = new ObservableCollection<SHOPSelect>(
  from shop in e.Result select new SHOPSelect(shop));

另一种技术是使用Partial Classes来定义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>

答案 1 :(得分:1)

不要继承新类型,只需扩展现有类型(部分类),添加自己的“仅限Silverlight”属性 - 在本例中为“IsSelected”。