0

我有一个 MVVM 集合,我“知道”它在 VM 中重新排序,但未在视图中以新顺序显示。给定类似于下面的代码,我是否应该期望列表在不操作 CollectionViewSource 的情况下以新的排序重新显示?

xml

<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 并获得完全相同的结果。

有没有人看到建议修复的模式?

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

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

4) 回到西班牙语,和 try (2) 一样

在此处输入图像描述

4

2 回答 2

2

尝试ListCollectionView改用:

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

您可以参考这篇文章了解更多详情。

于 2012-08-17T01:05:21.383 回答
1

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

于 2012-08-17T19:49:40.353 回答