2012-04-06 9 views
0

私は、すべて同じ選択肢を共有するコンボがたくさんあります。これらの選択肢は、私のViewModelから公開されるコレクションに含まれています。すべての罰金とダンディー。CollectionViewSource(SelectedItemはコンボでは機能しません)について混乱しています

これらの選択肢を並べ替えたいので、通常のReadonlyObservableCollection<T>の代わりにを私のViewModelから公開することにしました。私のViewModelでコレクションビューをソートします。

class EditStuffViewModel : ViewModelBase 
{ 
    public EditStuffViewModel (ObservableCollection<Choice> choices) 
    { 
     Choices = new CollectionViewSource() { Source = choices }.View; 
     Choices.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); 
    } 

    public ICollectionView Choices 
    { 
     get; 
     private set; 
    } 

    //snip other properties 
} 

このすべては今すべての私のコンボは今、自分の選択を同期する以外は正常に動作します。

これは私が望むものではありません。私は選択肢を共有したいが、選択は通常のバインディングにする。私は私のCollectionViewが選択を追跡していることを理解していると思うが、私はこれがそれぞれのコントロールのためにオプトインしていると思った。

私は明示的に成功し、それらを切り離した私のコンボにIsSynchronizedWithCurrentItem="False"を設定しようとしたが、その後、私のバウンドSelectedItemは(のViewModelのバウンドゲッターが呼ばれたが、結果が選択されることはありません)コンボで選択されることはありません。アイテムを選択すると、ViewModelのセッターが正しく更新されているようです。

私は明らかに、CollectionViewがどのように動作するのかについて基本的な何かを欠いています。誰も私を啓発することはできますか?

EDIT:私の悪い、このIsSynchronizedWithCurrentItem="False"作業を行います。詳細は私の答えを見てください。

乾杯。

+0

IsSynchronizedWithCurrentItem = "False"のソリューションでは、INotifyPropertyChangedを使用しましたか? OnPropertyChanged( "SelectedItem") – Dummy01

答えて

2

大変ご迷惑をかけて申し訳ありませんが、IsSynchronizedWithCurrentItem="False"を設定しても問題ありません。私はまた、並べ替えと一緒にフィルタを追加し、デフォルトの選択値は、項目のフィルタリングされたリストになかった。おっとっと。私は通常、標準のコレクションに決してしない時に明示的にIsSynchronizedWithCurrentItemをオフにする必要WHYのSelectedItemは常にItemCollectionに現在の項目と同期している場合、光がMSDN

に流されるためとして

; false SelectedItemが現在のアイテムと決して同期しない場合。 SelectorがCollectionViewを使用する場合にのみ、SelectedItemが現在のアイテムと同期されている場合は何も表示されません。デフォルト値はNothingです。だから、他の言葉で

、あなたが通常のコレクションにデフォルトのビューを使用するよりも、明示的にではなくCollectionViewを使用している場合、あなたは選択の同期を取得します。

0

私はしばらくWPFに触れていませんでしたが、私は、選択された項目を維持するために、それぞれのコンボボックスに異なるCollectionViewSourceのインスタンスが必要だと思います。

私は、このように彼らの選択した項目、SelectedItemプロパティは(私はViewオブジェクトがそれを持っていることを推測している)CollectionViewSourceオブジェクトの選択項目の状態プロパティにバインドされていると、コンボボックスはすべて同じソース・インスタンスを共有しているため、これはいると思います今同期されました。

したがって、コンボボックスごとに異なるCollectionViewSourceのインスタンスを使用してください。それでも同じソースの選択肢を共有できます。 ComboBoxは互いに別々に動作する必要があるため、異なるVMが必要です。


(未テスト)このような何か:

class EditStuffViewModel : ViewModelBase 
{ 
    public EditStuffViewModel (ObservableCollection<Choice> choices) 
    { 
     ChoiceViews = new List<ICollectionView>(); 

     for (var i = 0; i < 10; i++) { 
      var viewSource = new CollectionViewSource() { Source = choices }; 
      viewSource.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); 

      ChoiceViews.Add(viewSource.View); 
     } 
    } 

    public IList<ICollectionView> ChoiceViews 
    { 
     get; private set; 
    } 

    //snip other properties 
} 

そして、代わりにChoiceViewsのエレメントに結合する結合あなたのコンボボックスを変更します。

+0

サンプルコードはありがたいですが、すべてのコンボに対して新しいインスタンスをソートすることはできません。コンボの数は動的であり、多くのものがあります。一度自分のコレクションを並べ替えて公開するだけでいいと思う。 – GazTheDestroyer

関連する問題