silverlight – Cross DomainDataSource Combobox SelectedItem Binding

我是数据绑定和新手的新手. 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行为的一个重大变化.

点赞