Gostaria de selecionar um Nó TreeView WPF com um clique direito, logo antes do ContextMenu ser exibido.
Para WinForms, eu poderia usar um código como este nó Find clicado no menu de contexto , quais são as alternativas do WPF?
wpf
treeview
contextmenu
alex2k8
fonte
fonte
if (treeViewItem == null) treeView.SelectedIndex = -1
outreeView.SelectedItem = null
. Eu acredito que qualquer um deve funcionar.Se você deseja uma solução apenas XAML, pode usar o Blend Interactivity.
Suponha que os
TreeView
dados sejam vinculados a uma coleção hierárquica de modelos de visualização tendo umaBoolean
propriedadeIsSelected
e umaString
propriedadeName
, bem como uma coleção de itens filhos nomeadosChildren
.Existem duas partes interessantes:
A
TreeViewItem.IsSelected
propriedade está ligada àIsSelected
propriedade no modelo de exibição. Definir aIsSelected
propriedade no modelo de visualização como true selecionará o nó correspondente na árvore.Quando
PreviewMouseRightButtonDown
dispara na parte visual do nó (neste exemplo aTextBlock
), aIsSelected
propriedade no modelo de visualização é definida como verdadeira. Voltando a 1. você pode ver que o nó correspondente que foi clicado na árvore se torna o nó selecionado.Uma maneira de obter o Blend Interactivity em seu projeto é usar o pacote NuGet Unofficial.Blend.Interactivity .
fonte
i
eei
namespace resolvem embora e em quais assemblies eles podem ser encontrados. Suponho que:xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
exmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
, que são encontrados nos assemblies System.Windows.Interactivity e Microsoft.Expression.Interactions respectivamente.ChangePropertyAction
está tentando definir umaIsSelected
propriedade do objeto de dados vinculado, que não faz parte da interface do usuário, portanto, não temIsSelected
propriedade. Estou fazendo algo errado?IsSelected
propriedade conforme declarado no segundo parágrafo da minha resposta: Suponha que osTreeView
dados sejam vinculados a uma coleção hierárquica de modelos de visualização com uma propriedade booleanaIsSelected
... (ênfase minha).Usando "item.Focus ();" não parece funcionar 100%, usando "item.IsSelected = true;" faz.
fonte
Em XAML, adicione um manipulador PreviewMouseRightButtonDown em XAML:
Em seguida, trate o evento assim:
fonte
Usando a ideia original de alex2k8, manipulando corretamente os elementos não visuais da Wieser Software Ltd, o XAML de Stefan, o IsSelected de Erlend e minha contribuição de realmente tornar o método estático Genérico:
XAML:
Código C # por trás:
Edit: O código anterior sempre funcionou bem para este cenário, mas em outro cenário VisualTreeHelper.GetParent retornou null quando LogicalTreeHelper retornou um valor, então corrigiu isso.
fonte
Quase certo , mas você precisa estar atento para não visuais na árvore, (como um
Run
, por exemplo).fonte
Acho que registrar um manipulador de classe deve resolver o problema. Basta registrar um manipulador de eventos roteados no PreviewMouseRightButtonDownEvent do TreeViewItem em seu arquivo de código app.xaml.cs como este:
fonte
Outra maneira de resolver isso usando MVVM é o comando de ligação para clicar com o botão direito em seu modelo de visualização. Lá você também pode especificar outra lógica
source.IsSelected = true
. Isso usa apenasxmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
deSystem.Windows.Interactivity
.XAML para visualização:
Ver modelo:
fonte
Eu estava tendo problemas ao selecionar filhos com um método HierarchicalDataTemplate. Se eu selecionasse o filho de um nó, de alguma forma, ele selecionaria o pai raiz desse filho. Eu descobri que o evento MouseRightButtonDown seria chamado para todos os níveis em que a criança estava. Por exemplo, se você tiver uma árvore parecida com esta:
Item 1
- Criança 1
- Criança 2
- Subitem1
- Subitem2
Se eu selecionasse o Subitem2, o evento seria disparado três vezes e o item 1 seria selecionado. Resolvi isso com uma chamada booleana e assíncrona.
Parece um pouco confuso, mas basicamente eu defini o booleano como verdadeiro na primeira passagem e o redefini em outro encadeamento em alguns segundos (3 neste caso). Isso significa que a próxima passagem por onde tentaria subir na árvore será ignorada, deixando você com o nó correto selecionado. Parece que funciona até agora :-)
fonte
MouseButtonEventArgs.Handled
comotrue
. Pois a criança é a primeira a ser chamada. Configurar esta propriedade como true irá desativar outras chamadas para o pai.Você pode selecioná-lo com o evento ao pressionar o mouse. Isso irá acionar o select antes de o menu de contexto entrar em ação.
fonte
Se você deseja permanecer dentro do padrão MVVM, você pode fazer o seguinte:
Visão:
Código por trás:
ViewModel:
Agora você pode reagir à alteração da propriedade ClickedTreeElement ou pode usar um comando que funcione internamente com ClickedTreeElement.
Visão estendida:
fonte