2011-02-16 69 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行爲的突破性變化。