2011-02-16 63 views
3

我对数据绑定& XAML相当陌生,所以这可能是相当简单的事情,但我一直忍受它好几天了(和更多的谷歌搜索比我可以跟踪在这一点上感到沮丧),并会赞赏任何指向正确的方向。如果可能,我唯一的选择是保持纯XAML。Cross DomainDataSource Combobox SelectedItem Binding

在我RIA SL4的项目,我有两个实体PackageOSOS其中PackageOS具有通过PackageOS.OS的关联OS(通过PackageOS.OSID <关联 - >OS.ID - 和[Include] + .Include()正确安装在相关章节)

这是模板(在Page.Resource节中定义,以及所有其他涉及的DDS)我在DataForm中使用OSEntities列表绑定到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> 

核心问题是SelectedItemComboBox不起作用。所有的绑定都可以从IDE绑定向导中获得,所以这不是我输入错误路径的问题。我可以看到packageOSEntityDomainDataSource.Data.CurrentItem的类型为PackageOS

如果我创建的后端数据库手动输入,结果显示在PackageOS.OS文本块,所以我知道正确返回,但SelectedItem拒绝把它捡起来(它最终选择在下拉列表中的第一个值,而不管OS物品在PackageOS)。

非常感谢提前!

回答

1

终于明白了这一点。留下我的答案,希望能为我节省时间。

第一课 的问题是事实,我没有定制平等实施产生的实体和默认参考平等,因为我是用两种不同的情况下,没有工作。一旦我在我生成的实体上实现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> 

OSListGeneratorDomainContext

第三个教训加载它后会返回一个IEnumerable<OSEntity>通过其OSList财产 在DDS的DataTemplate你必须要明确与TwoWay绑定。这是新的行为;这让我花了好几天的时间去思考,我提到的大多数教程都使用SL3,但我没有意识到这是SL4中DDS DataTemplate行为的突破性变化。