我对数据绑定(bind)和 XAML 还很陌生,所以这可能是相当简单的事情,但我已经被它难住了好几天了(并且对谷歌搜索比我现在可以跟踪的更多感到沮丧)并且希望在正确的方向。我唯一的偏好是尽可能将其保留在纯 XAML 中。
在我的 RIA SL4 项目中,我有两个实体 PackageOS
和 OS
在哪里 PackageOS
与 OS
有关联通过PackageOS.OS
(通过 PackageOS.OSID
<-> OS.ID
- 和 [Include]
+ .Include()
在相关部分正确设置关联)
这是我在 DataForm 中用来获取 Page.Resource
的模板(在 OSEntities
部分以及所有其他涉及的 DDS 中定义)绑定(bind)到 PackageOS
的列表实体(来自 RIA GetOSEntities()
使用 DDS):
<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>
核心问题是
SelectedItem
的 ComboBox
不管用。所有绑定(bind)都可以从 IDE 绑定(bind)向导访问,所以我输入错误的路径不是问题。我可以看到 packageOSEntityDomainDataSource.Data.CurrentItem
为 PackageOS
类型.如果我在后端数据库中创建手动输入,结果显示在
PackageOS.OS
文本 block ,所以我知道它已正确返回,但 SelectedItem
拒绝拿起它(它最终选择下拉列表中的第一个值,而不管 OS
中的 PackageOS
项)。提前谢谢了!
最佳答案
终于想通了。留下我的答案,希望它可以节省其他人我花在这上面的时间。
第一课
问题在于我没有为生成的实体自定义 Equality 实现,并且默认引用相等不起作用,因为我使用了两个不同的实例。一旦我实现了IEquatable
在我生成的实体上(通过服务器端的 .shared.cs 部分类),一切都开始像魅力一样工作。
详情请见Silverlight ComboBox Control Population by Manishdalal
第二课
如果您能提供帮助,请不要使用多个 DDS 控件。尤其是在 DDS 上使用写入操作后,在提交更改之前,您无法加载/刷新共享 DomainContext 的任何其他 DDS。上面的链接显示了当您只想获取实体列表以填充 ComboBox 时,如何使用列表生成器来避免多个 DDS。
我的新代码如下所示:
<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>
通过其OSList
从 DomainContext
加载后的属性第三课
在 DDS DataTemplate 中,您必须明确使用双向绑定(bind)。这是新的行为;我花了几天时间才弄清楚,因为我提到的大多数教程都使用 SL3,我没有意识到这是 SL4 中 DDS DataTemplate 行为的重大变化。
关于silverlight - 跨域数据源组合框 SelectedItem 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5018784/