我是数据绑定和新手的新手. XAML,所以这可能是相当简单的事情,但我已经被困在它上好几天了(并且在这一点上比我可以跟踪更多的谷歌搜索感到沮丧)并且会欣赏正确方向的任何指针.如果可能的话,我唯一的偏好是保持纯XAML.
在我的RIA SL4项目中,我有两个实体PackageOS和OS,其中PackageOS通过PackageOS.OS与操作系统关联(通过PackageOS.OSID< – > OS.ID – 和[Include] .Include()正确关联设置)相关部分)
这是模板(在Page.Resource部分中定义以及所有其他涉及的DDS)我在DataForm中使用以将OSEntities List绑定到PackageOS实体(来自使用DDS的RIA GetOSEntities()):
<DataTemplate x:Key="POSItemTemplate">
<StackPanel>
<toolkit:DataField Label="PackageOS.OS">
<TextBlock Text="{Binding Source={StaticResource packageOSEntityDomainDataSource}, Path=Data.CurrentItem.OS}" />
</toolkit:DataField>
<toolkit:DataField Label="OS">
<ComboBox ItemsSource="{Binding Path=Data, Source={StaticResource osEntityDomainDataSource}}"
SelectedItem="{Binding Path=Data.CurrentItem.OS, Source={StaticResource packageOSEntityDomainDataSource}}"/>
</toolkit:DataField>
</StackPanel>
</DataTemplate>
核心问题是ComboBox的SelectedItem不起作用.所有绑定都可以从IDE Binding向导访问,因此我输入错误的路径不是问题.我可以看到packageOSEntityDomainDataSource.Data.CurrentItem是PackageOS类型.
如果我在后端数据库中创建一个手动条目,结果显示在PackageOS.OS文本块中,所以我知道它正确返回但是SelectedItem拒绝接收它(最终选择下拉列表中的第一个值,而不管OS中的OS项目如何) PackageOS).
提前谢谢了!
最佳答案 终于搞清楚了.留下我的回答,希望能节省别人花在这上面的时间.
第一课
问题在于我没有生成实体的自定义Equality实现,并且默认引用相等不起作用,因为我使用了两个不同的实例.一旦我在生成的实体上实现IEquatable(通过服务器端的.shared.cs部分类),一切都像魅力一样开始工作.
有关详细信息,请参阅Silverlight ComboBox Control Population by Manishdalal
第二课
如果可以帮助,请不要使用多个DDS控件.特别是在DDS上使用写入操作后,在提交更改之前,无法加载/刷新共享DomainContext的任何其他DDS.上面的链接显示了如何通过使用列表生成器来避免多个DDS,只需要获取实体列表以填充ComboBox.
我的新代码如下所示:
<DataTemplate x:Key="POSItemTemplate">
<StackPanel d:DataContext="{Binding Source=packageOSDomainDataSource, Path=Data.CurrentItem}">
<toolkit:DataField Label="OS">
<ComboBox DisplayMemberPath="Name"
ItemsSource="{Binding Path=OSList, Source={StaticResource OSListGenerator}}"
SelectedItem="{Binding Path=OS, Mode=TwoWay}" />
</toolkit:DataField>
</StackPanel>
</DataTemplate>
OSListGenerator返回IEnumerable< OSEntity>的位置从DomainContext加载后通过其OSList属性
第三课
在DDS DataTemplate中,您必须明确使用TwoWay绑定.这是新的行为;由于我提到的大多数教程都使用SL3而且我没有意识到这是SL4中DDS DataTemplate行为的一个重大变化.