2012-08-17 54 views
0

我有一個MVVM集合,我「知道」在虛擬機中重新排序,但未在視圖中以新順序顯示。給定類似於下面的代碼,我是否應該期望列表以新的排序重新顯示而不用操作CollectionViewSource?對綁定的可觀察集合進行排序

XAML

<Menu Name="_mainMenu" Height="22" > 
    <MenuItem Header="Language" 
       ItemsSource="{Binding AvailableCultures}" > 
     <MenuItem.ItemTemplate> 
      <DataTemplate> 
       <MenuItem IsCheckable="True" 
          IsChecked="{Binding IsSelected, Mode=TwoWay}" 
          Header="{Binding DisplayName}"/> 
      </DataTemplate> 
     </MenuItem.ItemTemplate> 
    </MenuItem> 
</Menu> 

VM

public ObservableCollection<OptionLocalizedViewModel<CultureInfo>> 
            AvailableCultures { get; private set; } 

private void OnSelectionChange(OptionLocalizedViewModel<CultureInfo> option) 
{ 
    ... 
    var sorted = AvailableCultures.OrderBy(x => x.DisplayName); 
    AvailableCultures = 
     new ObservableCollection<OptionLocalizedViewModel<CultureInfo>>(sorted); 

    NotifyOfPropertyChange(() => AvailableCultures); 
} 

UPDATE

順序被改變,但不如預期(而不是調試器顯示新排序ObsCollection是)。我也嘗試拋開ObsCollection,直接用IEnumerable綁定,獲得完全相同的結果。

有沒有人看到一種模式,表明修復?

1)初始負載,看上去所應當

enter image description here

2)選擇西班牙語,所以應該是西班牙語第一,但並不

enter image description here

3)回英語,但不知何故,英語是最後一個。這是如何翻轉?

enter image description here

4)回到了西班牙,同試(2)

enter image description here

+0

做了一個類似的程序,它爲我工作,你確定你的NotifyOfPropertyChange工作正常嗎? – 2012-08-17 01:02:47

+0

@KDiTraglia。不,現在一切都是可疑的。我甚至想知道如果我需要一個正在被替換的ObservableCollection,但正如你可以看到它在那裏。 – Berryl 2012-08-17 01:11:11

+0

因爲您正在開發並更換整個系列,所以需要它。 – 2012-08-17 01:27:18

回答

1

這理論上應該工作,只是一定INotifyPropertyChanged的是實際上得到正確解僱,因爲它有一個不同的替換整個集合時,而不僅僅是改變它的內容是必要的。

2

嘗試使用ListCollectionView代替:

ListCollectionView LCV = new ListCollectionView(YourObservableCollection); 
LCV.GroupDescriptions.Add(new PropertyGroupDescription("PropertyName")); 
YourDataBoundProperty = LCV; 

您可以參考this article更多細節。

+1

我甚至不知道這一個。它意味着包裝一個可觀察的集合? – Berryl 2012-08-17 01:14:37

+0

@Berryl WPF在綁定到集合時在內部使用ICollectionView。請參閱CollectionViewSource(http://msdn.microsoft.com/zh-cn/library/system.windows.data.collectionviewsource.getdefaultview.aspx) – cordialgerm 2012-08-17 01:17:06

相關問題