0

「知っている」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を表示するものではありません)。また、IEnumerableに直接バインドするために、ObsCollectionを破棄して、まったく同じ結果を得ようとしました。

誰かが修正を示唆するパターンを見ますか?

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 に答える