Cross DomainDataSource Combobox SelectedItem Binding

时间:2011-02-16 16:04:08

标签: silverlight xaml data-binding

我对Data binding& amp; XAML,所以这可能是相当简单的事情,但我已经被困在它上好几天了(并且在这一点上比我可以跟踪更多的谷歌搜索感到沮丧)并且会欣赏正确方向的任何指针。我唯一的选择是尽可能将它保留在纯XAML中。

在我的RIA SL4项目中,我有两个实体PackageOSOS,其中PackageOSOSPackageOS.OS有关联(通过{{关联) 1}}< - > PackageOS.OSID - 以及OS.ID + [Include]在相关部分正确设置)

这是模板(在.Include()部分中定义以及所有其他涉及的DDS)我在DataForm中使用Page.Resource List绑定到OSEntities实体(来自RIA) PackageOS使用DDS):

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> 的{​​{1}}无效。所有绑定都可以从IDE Binding向导访问,因此我输入错误的路径不是问题。我可以看到SelectedItem属于ComboBox类型。

如果我在后端数据库中创建一个手动条目,结果会显示在packageOSEntityDomainDataSource.Data.CurrentItem文本块中,所以我知道它已正确返回但是PackageOS拒绝接收它(它最终会选择第一个无论PackageOS.OS中的SelectedItem项是什么,下拉列表中的值。

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

终于弄明白了。留下我的回答,希望能节省别人花在这上面的时间。

第一课 问题在于我没有生成实体的自定义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>

OSListGeneratorIEnumerable<OSEntity>

加载后OSList通过DomainContext属性返回{{1}}的位置

第三课 在DDS DataTemplate中,您必须明确使用TwoWay绑定。这是新的行为;由于我提到的大部分教程都使用SL3而且我没有意识到这是SL4中DDS DataTemplate行为的一个重大变化。