我有一个MVVM集合,我“知道”在VM中重新排序但没有在视图中显示它的新顺序。给定类似下面的代码,我是否应该在不操纵CollectionViewSource的情况下重新显示列表?
<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>
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。
有没有人看到一个暗示修复的模式?
答案 0 :(得分:2)
请尝试使用ListCollectionView
:
ListCollectionView LCV = new ListCollectionView(YourObservableCollection);
LCV.GroupDescriptions.Add(new PropertyGroupDescription("PropertyName"));
YourDataBoundProperty = LCV;
您可以参考this article了解更多详情。
答案 1 :(得分:1)
这理论上应该工作,只要确保INotifyPropertyChanged实际上被正确触发,因为在用不同的集合替换整个集合时需要它而不仅仅是改变它的内容。