と呼ばれます。この問題は主にコンテキストメニューに関連しますが、私の特定のケースではTreeViewコントロールに関するものです。コンテキストメニューとしてのTreeViewアイテムのWPF選択は
TreeViewアイテムにはStackPanelが含まれています。そのStackPanelはStaticResource(これはContextMenuです)に割り当てられたContextMenuプロパティです。このContextMenuはICommandにつながり、したがってそのことを行います。
現在のところ、これは私が信じるデフォルトの動作ですが、TreeViewの項目を右クリックするとその項目は選択されません。これはWindowsでは一般的ですが、ここでは発生しません。私はそれが起こることを望む(しかし、私は方法を知らない)。
少しのフォローアップ情報:ツリービューで選択した項目があり、これがマウスの左クリックで変更されます。しかし、左クリックイベントではなく、むしろイベントは 'SelectedItemChanged'です。これは、私のデータコンテキスト(ビューモデル)で 'SelectedItem'をSelectedItemに設定する方法につながります。これはTreeViewの選択された項目が「読み取り専用」であるため、このようにしなければなりません。私はそれが手元に問題にどれだけ役に立つか分からないが、
このコードは、ここにある:
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (this.ScenesTreeView01 == null)
return;
if (this.ScenesTreeView01.DataContext == null)
return;
var DataContext = this.ScenesTreeView01.DataContext as ScenesViewModel;
if (e.NewValue is SceneViewModel)
{
DataContext.SelectedScene = (SceneViewModel)e.NewValue;
}
if (e.NewValue is CharacterViewModel)
{
DataContext.SelectedCharacter = (CharacterViewModel)e.NewValue;
}
}
それは大丈夫、あなたが左クリックと言う場所があるとは思えないので、選択されたアイテムがここにあるので、右クリック(および左クリック)で選択したアイテムを割り当てるように指示するにはどうすればよいか分かりません。
どうすればいいですか?
編集:MVVMを使用しているので、RoutedPropertyChangedEventArgs eというパラメータを持つSelectedItemChangedのようなメソッドがあると、e.SourceはTreeViewItemではなく、自分のビューモデルに戻ってきます。あなたのSceneViewModel
とCharacterViewModel
クラスとバインドにIsSelected
プロパティを追加することができ
TreeView.MouseRightButtonDown += Tv_MouseRightButtonDown;
void Tv_MouseRightButtonDown(object sender, MouseButtonEventArgs e) {
var tvItem = e.Source as TreeViewItem;
if (tvItem != null) {
tvItem.IsSelected = true;
}
}
申し訳ありません。私はこれが私のためにはうまくいかない理由を説明する編集を追加しました。私はMVVMを使用しているので、e.Sourceは私のViewModelのデータオブジェクトをTreeViewItemではなく参照しています。私の質問にそれを含めるべきだったのですが、もう一度私の謝罪ははっきりしないのです。 – TheFaithfulLearner
SelectedItemChangedイベントまたはMouseRightButtonDownに対してのみこれを確認しましたか? Source/OriginalSourceは、実際にイベントを起こしたフレームワーク要素を常に指し示すと思っていました。 わからない場合は、SnoopやWPF Inspectorのようなツールを使用して、イベントの発生場所と処理場所を調べることができます。 とにかく、MVVMを使用している場合は、TreeViewItemのスタイルを作成し、そのIsSelectedプロパティをviewmodelの何かにバインドするよりクリーンなアプローチかもしれません。 – wilford
私はこれが遅い応答であることを知っていますが、問題は同じでしたので、私はこの解決策を使用できません。しかし、答えに時間をとってくれてありがとう、 – TheFaithfulLearner