我有一个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”。
这样做的最佳方式是什么?
答案 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”。