Saya ingin memilih WPF TreeView Node dengan klik kanan, tepat sebelum ContextMenu ditampilkan.
Untuk WinForms saya bisa menggunakan kode seperti ini Temukan node yang diklik di bawah menu konteks , apa saja alternatif WPF?
wpf
treeview
contextmenu
alex2k8.dll
sumber
sumber
if (treeViewItem == null) treeView.SelectedIndex = -1
atautreeView.SelectedItem = null
. Saya percaya keduanya harus bekerja.Jika Anda menginginkan solusi khusus XAML, Anda dapat menggunakan Blend Interactivity.
Asumsikan
TreeView
data is terikat ke kumpulan hierarki model tampilan yang memilikiBoolean
propertiIsSelected
danString
propertiName
serta kumpulan item anak bernamaChildren
.Ada dua bagian yang menarik:
The
TreeViewItem.IsSelected
properti terikat keIsSelected
properti pada tampilan model. MenyetelIsSelected
properti pada model tampilan ke true akan memilih simpul yang sesuai di pohon.Saat
PreviewMouseRightButtonDown
diaktifkan pada bagian visual dari node (dalam contoh ini aTextBlock
)IsSelected
properti pada model tampilan disetel ke true. Kembali ke 1. Anda dapat melihat bahwa simpul terkait yang diklik di pohon menjadi simpul yang dipilih.Salah satu cara untuk mendapatkan Blend Interactivity dalam proyek Anda adalah dengan menggunakan paket NuGet Unofficial.Blend.Interactivity .
sumber
i
danei
namespace dan rakitan mana mereka dapat ditemukan. Saya berasumsi:xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
danxmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
, yang ditemukan di rakitan System.Windows.Interactivity dan Microsoft.Expression.Interactions masing-masing.ChangePropertyAction
mencoba menyetelIsSelected
properti dari objek data terikat, yang bukan bagian dari UI, jadi tidak memilikiIsSelected
properti. Apakah saya melakukan sesuatu yang salah?IsSelected
properti seperti yang dinyatakan dalam paragraf kedua jawaban saya: AsumsikanTreeView
data terikat ke kumpulan hierarki model tampilan yang memiliki properti BooleanIsSelected
... (penekanan saya).Menggunakan "item.Focus ();" sepertinya tidak berfungsi 100%, menggunakan "item.IsSelected = true;" tidak.
sumber
Di XAML, tambahkan penangan PreviewMouseRightButtonDown di XAML:
Kemudian tangani acara seperti ini:
sumber
Menggunakan ide asli dari alex2k8, menangani non-visual dengan benar dari Wieser Software Ltd, XAML dari Stefan, IsSelected dari Erlend, dan kontribusi saya untuk benar-benar membuat metode statis Generik:
XAML:
C # kode di belakang:
Sunting: Kode sebelumnya selalu bekerja dengan baik untuk skenario ini, tetapi dalam skenario lain VisualTreeHelper.GetParent mengembalikan null ketika LogicalTreeHelper mengembalikan nilai, jadi perbaiki itu.
sumber
Hampir Benar , tetapi Anda perlu berhati-hati terhadap non visual di pohon, (seperti
Run
, misalnya).sumber
Saya pikir mendaftarkan penangan kelas harus melakukan triknya. Cukup daftarkan pengendali kejadian yang dirutekan pada PreviewMouseRightButtonDownEvent TreeViewItem di file kode app.xaml.cs Anda seperti ini:
sumber
Cara lain untuk mengatasinya menggunakan MVVM adalah perintah bind untuk klik kanan ke model tampilan Anda. Di sana Anda juga dapat menentukan logika lain
source.IsSelected = true
. Ini hanya digunakanxmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
dariSystem.Windows.Interactivity
.XAML untuk dilihat:
Lihat model:
sumber
Saya mengalami masalah saat memilih anak dengan metode HierarchicalDataTemplate. Jika saya memilih anak dari sebuah simpul, entah bagaimana itu akan memilih orang tua akar dari anak itu. Saya menemukan bahwa event MouseRightButtonDown akan dipanggil untuk setiap level anak itu. Misalnya jika Anda memiliki pohon seperti ini:
Item 1
- Anak 1
- Anak 2
- Subitem1
- Subitem2
Jika saya memilih Subitem2, acara akan diaktifkan tiga kali dan item 1 akan dipilih. Saya menyelesaikan ini dengan boolean dan panggilan asynchronous.
Rasanya agak kaku tetapi pada dasarnya saya mengatur boolean ke true pada lintasan pertama dan mengatur ulang di utas lain dalam beberapa detik (3 dalam kasus ini). Ini berarti bahwa lintasan berikutnya di mana ia akan mencoba untuk naik ke pohon akan dilewati sehingga Anda memilih simpul yang benar. Tampaknya berfungsi sejauh ini :-)
sumber
MouseButtonEventArgs.Handled
ketrue
. Karena anak itu yang pertama dipanggil. Pengaturan properti ini ke true akan menonaktifkan panggilan lain ke induk.Anda dapat memilihnya dengan acara mouse down. Itu akan memicu pemilihan sebelum menu konteks dimulai.
sumber
Jika Anda ingin tetap berada dalam pola MVVM, Anda dapat melakukan hal berikut:
Melihat:
Kode Belakang:
ViewModel:
Sekarang Anda dapat bereaksi terhadap perubahan properti ClickedTreeElement atau Anda dapat menggunakan perintah yang secara internal bekerja dengan ClickedTreeElement.
Tampilan Diperpanjang:
sumber