对绑定的可观察集合进行排序

时间:2012-08-17 00:54:18

标签: c# wpf xaml mvvm observablecollection

我有一个MVVM集合,我“知道”在VM中重新排序但没有在视图中显示它的新顺序。给定类似下面的代码,我是否应该在不操纵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);
}

更新

订单被更改,但不是预期的(而不是调试器显示新排序的ObsCollection)。我也尝试放弃ObsCollection,转而使用完全相同的结果直接绑定到IEnumerable。

有没有人看到一个暗示修复的模式?

1)初始加载,看起来应该

enter image description here

2)选择西班牙语,所以首先应该是Espanol,但不是

enter image description here

3)回到英语,但不知何故英语是最后的。这怎么翻了?

enter image description here

4)返回西班牙语,与try(2)

相同

enter image description here

2 个答案:

答案 0 :(得分:2)

请尝试使用ListCollectionView

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

您可以参考this article了解更多详情。

答案 1 :(得分:1)

这理论上应该工作,只要确保INotifyPropertyChanged实际上被正确触发,因为在用不同的集合替换整个集合时需要它而不仅仅是改变它的内容。