2012-08-17 57 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

相关问题