2010-01-12 82 views
1

我會盡量解釋儘可能簡明。我有兩個對象,第一個我們將調用具有Id屬性的對象A,第二個對象將調用具有ParentId屬性的對象B.明顯的關係是對象B的ParentId被設置爲對象A的Id屬性。我使用的MVVM模式,所以在視圖模型我有2個ObservableCollections,一個包含對象A中的其他對象B.在建設中的視圖模型中,我創建並填充的ObservableCollection <「A」>命名listItems中。我的XAML很簡單,奇綁定行爲在WPF

<StackPanel> 
    <ListBox IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding ListItems}"> 
    </ListBox> 

    <ComboBox SelectedValuePath="ParentId" SelectedValue="{Binding Path=ListItems/Id, Mode=OneWay}" ItemsSource="{Binding ComboItems}"> 
    </ComboBox> 

    <Button Click="Button_Click" Content="Push Me"/>    
</StackPanel> 

正如你所看到的組合框的的SelectedValue綁定到當前listItems中的項目的ID屬性。所以基本上,列表框和組合框都在主要細節中。

如果您按下按鈕,它將填充名稱ComboItems的ObservableCollection <'B'> ComboItems,然後填充組合框。現在,這是奇怪的開始。當我啓動程序時,如果我唯一要做的就是按下按鈕,然後在列表框中選擇一個項目,由於SelectedValue綁定,組合框將正確選擇一個項目。但是,如果我啓動程序並首先在列表框中選擇一個項目,然後按下按鈕,則當前的組合框項目不會隨當前的列表框項目而改變。綁定似乎永遠被打破。有誰知道爲什麼發生這種情況?

詩篇。如果我在設置SelectedValue/SelectedValuePath之前在組合框上設置ItemsSource,則主/細節綁定將無法工作。我知道xaml有命令,但這似乎有點脆弱。所以如果有人也有這個意見,我全都聽過。

感謝,內特

編輯 -

當綁定的SelectedValue,這是非常脆弱的。如果綁定正在工作,即沒有選擇列表框中的任何內容,然後填充組合框,如果您選擇組合框中的項目,綁定將會中斷。在浪費了很多時間之後,我選擇了綁定SelectedItem。這種綁定在我之前指定的任何條件下都不會中斷。然而,我會回答爲什麼SelectedValue綁定如此荒謬。再次感謝所有已經回答或將會回答的問題。

回答

2

是啊,這是我們在相當多絆倒的問題。

的問題是,ItemsSource屬性獲取一個新值後,該SelectedValue綁定將被清除。吮吸,直到今天我們還沒有找到適當的解決方案。

這裏有幾個解決方法:

  • 重置SelectedValue代碼綁定,一旦新的ItemsSource已定。您可以在轉換器中執行此操作,或者在知道哪個位置將替換ItemsSource綁定的位置(如DataContextChanged事件)。

  • 而不是在ItemsSource上使用Binding,請嘗試使用CollectionViewSource和過濾器。將所有項目放入CollectionViewSource對象中,並在組合框更改值時過濾項目。

  • 手動得到您的項目的舊時尚的方式,當你的列表框拋出一個SelectionChanged事件。

請注意,所有的解決方案都不是書中最漂亮的。我會選擇2,它是最乾淨的IMO;)

希望這有助於!

+0

感謝您的回答。我看到這是如何適用於您在xaml中綁定綁定的順序,但我不確定它適用於我的第一個問題,即與在填充組合框之前在列表框中選擇項目有關的問題。在這種情況下,組合框綁定的ObservableCollection永遠不會被替換,但只能填充數據,所以我不明白/認爲SelectedValue綁定會被清除。謝謝你回答我的第二個問題。這似乎是奇怪的設計,但我想owell。 – NastyNateDoggy 2010-01-12 16:31:21

+0

這看起來確實很奇怪。也許你的ListItems集合受到某種程度的影響。您似乎將IsSynchronizedWithCurrentItem設置爲true,這意味着它會將您的集合的CurrentItem匹配到最初將爲null的SelectedItem。也許這會重置您的ListBox中的選定項目? – Arcturus 2010-01-13 08:26:11

+0

我把這個標記爲答案,即使我覺得它沒有完全回答我的問題。閱讀我上面的編輯,看看我的最終解決方案。 – NastyNateDoggy 2010-02-16 23:34:39