Silverlight 跨域数据源组合框SelectedItem绑定

Silverlight 跨域数据源组合框SelectedItem绑定,silverlight,xaml,data-binding,Silverlight,Xaml,Data Binding,我对数据绑定&XAML相当陌生,所以这可能是一件相当简单的事情,但我已经被它难住了好几天了(现在我无法跟踪更多的谷歌搜索结果),如果有任何指向正确方向的指针,我将不胜感激。如果可能的话,我唯一的偏好是将它保存在纯XAML中 在我的RIA SL4项目中,我有两个实体PackageOS和OS,其中PackageOS通过PackageOS.OS(通过PackageOS.OSIDOS.ID-和[Include]+.Include]关联到OS(在相关部分正确设置) 这是我在数据表单中使用的模板(在Page

我对数据绑定&XAML相当陌生,所以这可能是一件相当简单的事情,但我已经被它难住了好几天了(现在我无法跟踪更多的谷歌搜索结果),如果有任何指向正确方向的指针,我将不胜感激。如果可能的话,我唯一的偏好是将它保存在纯XAML中

在我的RIA SL4项目中,我有两个实体
PackageOS
OS
,其中
PackageOS
通过
PackageOS.OS
(通过
PackageOS.OSID
OS.ID-和
[Include]
+
.Include]关联到
OS
(在相关部分正确设置)

这是我在数据表单中使用的模板(在
Page.Resource
部分以及所有其他涉及的DDS中定义),用于获取
OSEntities
列表,以绑定到
PackageOS
实体(来自RIA
GetOSEntities()
使用DDS):


核心问题是
ComboBox
SelectedItem
不工作。所有绑定都可以从IDE绑定向导访问,因此键入错误路径不是问题。我可以看到
packageOSEntityDomainDataSource.Data.CurrentItem
的类型为
PackageOS

如果我在后端数据库中创建一个手动条目,结果将显示在
PackageOS.OS
textblock中,因此我知道它被正确返回,但
SelectedItem
拒绝拾取它(不管
PackageOS
中的
OS
项如何,它最终都会选择下拉列表中的第一个值)


非常感谢

终于找到了答案。留下我的答案,希望它能为其他人节省我花在这上面的时间

第一课 问题在于,我没有为生成的实体提供自定义的相等实现,并且由于使用了两个不同的实例,所以默认的引用相等不起作用。一旦我在生成的实体上实现了
IEquatable
(通过服务器端的.shared.cs分部类),一切都开始运转起来

详情请参阅

第二课 如果可以,请不要使用多个DDS控件。尤其是在DDS上使用写操作后,在提交更改之前,无法加载/刷新共享DomainContext的任何其他DDS。上面的链接显示了当您只想选择要填充组合框的实体列表时,如何通过使用列表生成器避免多个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
DomainContext
加载后通过其
OSList
属性返回
IEnumerable

第三课 在DDS DataTemplate中,必须使用双向绑定显式。这是新的行为;我花了好几天的时间才弄明白,因为我提到的大多数教程都在使用SL3,我没有意识到这是SL4中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>