0

カスタムを実装していますMultiSelectionTreeView。このコントロールは から継承されItemsControl、からMultiSelectionTreeViewItem継承されTreeViewItemます。VirtualizationStackPanel膨大なデータ セットがあるため、ホストとして使用するこのコントロールにバインドしたいと考えています。

TreeViewItems IsSelectedプロップを ViewModelClassIsSelectedプロパティにバインドしました。ツリーを下にスクロールすると、選択したアイテムがビューポートから外れ、IsSelectedプロパティが false に設定されます (仮想化により、MultiSelectionTreeViewItems がツリーから切断されたため)。スクロール バックすると、新しいアイテム コンテナー (MultiSelectionTreeViewItem) が作成され、その IsSelected プロパティが ViewModel に従って true に設定されます。

現時点では、コンテナー項目がビューポートから出て行った/ビューポートに戻ったために Selected イベントが発生したのか、モデルまたはビューモデル レイヤーに変更があったのかを判断できません。

さらに悪いことに、切断されたアイテムの IsSelected プロパティを設定できません。たとえば、下にスクロールしてより多くのアイテムを選択するには、Shift 選択を使用します。

コントロールの実装でビューモデル クラスにアクセスできません。

何か案が?

4

1 に答える 1

0

仮想化のカスタム実装を作成すると、この問題を解決できます。たまたま、オンラインで購入した本の PDF へのリンクを見つけました。この本には、仮想化に関する素晴らしい章があります (第 8 章)... WPF Control Development Unleashed .

この情報を使用して独自の仮想化パネルを実装しましたが、かなり複雑であると言わざるを得ません。ただし、独自のシステムを実装する場合は、ビュー モデル オブジェクトに別のプロパティを追加できます。

public bool IsRealized { get; set; }

「実現された」アイテムは、メモリ内にのみ存在する「仮想化された」アイテムとは対照的に、実際に表示されるアイテムです。したがって、このプロパティを使用すると、プロパティが次IsSelectedの場合にのみ反応するようにプロパティを調整できます。IsRealizedtrue

public bool IsSelected
{ 
    get { return isSelected; }
    set { if (IsRealized) { isSelected = value; NotifyPropertyChanged("IsSelected"); }
}

次に、カスタム仮想化パネルでIsRealized、アイテムが実現または仮想化されるたびにプロパティを設定できます...ただし、警告する必要があります...それ多くの作業になります.

于 2013-08-30T08:38:08.117 に答える