2012-01-31 15 views
0

アイテムのListViewがあり、ユーザーがコントロールのコードビハインドのイベントハンドラに頼らずにアイテムを選択または選択解除するたびにコードを実行したい - すべてがビュー内で行われているコントロールのdatacontextはに設定されています。バインドを使用した選択リストの変更の表示

ListViewの選択モードが「シングル」の場合、単に「SelectedItem」をビューのプロパティにバインドし、そのプロパティの変更イベントを監視することができます。ただし、選択モードが「複数」の場合、動作は完全に信頼できません。時には、最後にクリックされた項目によってSelectedItemが変更されることがあります。選択モードが単一でない場合、このDependencyPropertyは完全なゴミ箱に見えます。バインディングを使用して、ListViewのSelectedItemsコレクションの変更をどのように追跡できますか?

私はExpressionブレンドを使用しないので、Interaction.Triggersや類似のライブラリソリューションは使用しません。

<ListView ItemsSource="{Binding Path=Zones}" 
      SelectionMode="Multiple" 
      SelectedItem="{Binding SelectedZone}"> 
+0

"コントロールのコードビハインドのイベントハンドラに頼らずに"この文を実際に理解していません。だから、コードビハインドで何かを中継していなければ、どのように 'DataBinding'を作りたいのですか? – Tigran

+0

@Tigran WPFでは、xamlファイル(UI)には、プログラムロジックとListView.SelectionChangedイベントなどのコントロール用のイベントハンドラを含むことができるコードビハインドがあります。 MVVMパターンと呼ばれるものがあります。これは、プロパティをプログラマチックに操作する中間メソッドを使用するのではなく、コントロールをオブジェクトモデルに直接バインドできるように、datacontextとバインディングを使用することです。私のコントロールはそのような方法で基になるデータに束縛されているので、ビューのコードとコントロールのコードビヘイビアの間でこの基礎となるデータに対して行われた作業を分割するのは非常に苦労します。 – Alain

+0

ListViewで仮想化をオフにしてみてください。現在選択されているアイテムと同じ画面にあるアイテムをクリックすると、アイテムにスクロールしなければならない場合とは異なる結果が表示されます。これは奇妙に聞こえるが、私が試みるのはListViewを単一にすることだが、isManuallySelectedに基づいてXAMLの項目をトグル可能(boolプロパティはisManuallySelected)とカスタムプレゼンテーションにして、マルチセレクションのように感じる。 – Paparazzi

答えて

0

唯一の解決策は、リスト内のItemsTemplateをトグル可能なコントロール内にラップし、コマンドバインディング(ボタンのような)があり、そのコマンドバインディングにビューモデルをバインドすることでした。これは大きな苦痛で、HitTestVisibilityでハッキングし、ボタンの状態をアイテムの選択状態にバインドする必要がありますが、それは最後に機能します。

0

thisで説明されている他の方法はありません。

事は、それほど珍しく、SelectedItemsプロパティは読み取り専用であるため、データバインドできません。

これまでは難しい話でしたが、残念なことに

+0

私は検索の努力を感謝します。しかし、私はすでにその記事を読んでいますが、部分的には私は特にライブラリソリューションを使いたくないと言いました。このソリューションは、(私はプロジェクトのコードベースに含めたくない)添付プロパティのライブラリを追加することを含みます。さらに、2つの異なるListViewのSelectedItemsコレクションを同期化するためにのみ記述されています。私の現在のニーズに。 – Alain

+0

また、SelectedItemsプロパティが読み取り専用であるという事実は、私には問題ではありません。本当の問題は、SelectedItemsプロパティはコレクション内のアイテムのpropertychangedイベントを公開しないため、このバインディングは決して変更されないことです。SelectedItemsコレクションは、 ListView – Alain

+0

@Alain:私が提供したリンクを再確認し、私には(前のように)**ソース**のページの下にリンクがあるようです。したがって、それを実行するために外部ライブラリを必要としません。ソリューション内でクラスを再利用するだけです。私はこのソリューションを使用しませんでしたが、時間前に調べました。 – Tigran

関連する問題