6

同じ利用可能な選択肢をすべて共有するコンボがたくさんあります。これらの選択肢は、ViewModel から公開されたコレクションで提供されます。すべて元気でダンディ。

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

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 のセッターが正しく更新されるようです。

CollectionView がどのように機能するかについて、明らかに根本的なことが欠けています。誰でも私を啓発できますか?

EDIT:私の悪い、これはで動作IsSynchronizedWithCurrentItem="False"ます。詳細については、私の回答を参照してください。

乾杯。

4

2 に答える 2

8

皆さんの時間を無駄にして申し訳ありませんが、設定IsSynchronizedWithCurrentItem="False"はうまくいきます。並べ替えとともにフィルターも追加しましたが、デフォルトで選択された値は、フィルター処理されたアイテムのリストにありませんでした。おっとっと。

通常は標準コレクションでは行わないのに、IsSynchronizedWithCurrentItem を明示的にオフにする必要がある理由については、MSDNに光が当てられています。

SelectedItem が常に ItemCollection 内の現在のアイテムと同期される場合はtrue 。SelectedItem が現在の項目と同期されない場合はfalse 。セレクターが CollectionView を使用する場合にのみ、SelectedItem が現在のアイテムと同期されている場合は何もありません。デフォルト値はなしです。

つまり、CollectionView通常のコレクションでデフォルト ビューを使用するのではなく、明示的に を使用すると、選択が同期されます。

于 2012-04-06T12:16:30.063 に答える
0

しばらく WPF に触れていませんCollectionViewSourceでしたが、選択したアイテムを維持するには、コンボボックスごとに異なるインスタンスが必要だと思います。

これは、SelectedItemプロパティがオブジェクトの選択された項目の状態プロパティにバインドされておりCollectionViewSource(オブジェクトにはそれがあると推測していViewます)、ComboBoxes がすべて同じソース インスタンスを共有しているため、選択された項目が同期されているためだと思います。

したがって、CollectionViewSourceComboBox ごとに異なるインスタンスを使用するだけです。同じソースの選択肢を引き続き共有できます。コンボボックスは互いに別々に動作する必要があるため、異なる 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
}

次に、ComboBoxes バインディングを変更して、ChoiceViews代わりに の要素にバインドします。

于 2012-04-06T10:30:38.143 に答える