¿Hay alguna forma de seleccionar artículos dentro de este TreeView personalizado en WPF? -- # campo con wpf campo con xaml campo con treeview camp Relacionados El problema

Is there a way to select items within this custom TreeView in WPF?


1
vote

problema

Español

Estoy trabajando desde la respuesta de esta pregunta: Pantalla TreeViewIdem como filas de cuadrícula en WPF y estoy luchando para que los artículos en el árbol sean seleccionados. ¿Cómo haces eso con este tipo de código? Gracias

He intentado hacer los bloques de texto, los cuadros de texto en su lugar y no tuvimos suerte.

  <TreeView x:Name="treeviewList"  ItemsSource="{Binding ManufacturerList}">             <TreeView.ItemTemplate>                 <DataTemplate>                     <TreeViewItem  ItemsSource="{Binding Models}">                         <TreeViewItem.Header>                             <Grid Width="350">                                 <Grid.ColumnDefinitions>                                     <ColumnDefinition Width="100"></ColumnDefinition>                                     <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>                                     <ColumnDefinition ></ColumnDefinition>                                 </Grid.ColumnDefinitions>                                 <TextBlock Text="{Binding Task}" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>                                 <TextBlock Text="{Binding durationTotal}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>                                 <TextBlock Text="{Binding HeadNote}" HorizontalAlignment="Left"  VerticalAlignment="Center"  Grid.Column="2"/>                             </Grid>                         </TreeViewItem.Header>                         <TreeViewItem.ItemTemplate>                             <DataTemplate>                                 <Grid Margin="-20,0,0,0">                                     <Grid.ColumnDefinitions>                                         <ColumnDefinition Width="100"></ColumnDefinition>                                         <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>                                         <ColumnDefinition></ColumnDefinition>                                     </Grid.ColumnDefinitions>                                      <TextBlock Text="{Binding SubTask}" Margin="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>                                     <TextBlock Text="{Binding Duration}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>                                     <TextBlock Text="{Binding Notes}" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="2"/>                                 </Grid>                             </DataTemplate>                         </TreeViewItem.ItemTemplate>                     </TreeViewItem>                 </DataTemplate>             </TreeView.ItemTemplate>         </TreeView>   

c # Código

  public class Company {     public string Task { get; set; }     public string durationTotal { get; set; }     public string HeadNote { get; set; }     public List<Model> Models { get; set; } } public class Model {     public string SubTask { get; set; }     public string Duration { get; set; }     public string Notes { get; set; }       }   
  List<Company> ManufacturerList = new List<Company>();          ManufacturerList.Add(new Company()         {             Task = "Coding",             durationTotal = "4",             HeadNote = "Coding Task",             Models = new List<Model>()             {new Model(){SubTask = "Write", Duration = "2", Notes ="It pays the bills" },             new Model(){SubTask = "Compile", Duration = "1", Notes ="c# or go home" },             new Model(){SubTask = "Test", Duration = "1", Notes ="works on my m/c" },}         });           ManufacturerList.Add(new Company()         {             Task = "Communicate",             durationTotal = "2",             HeadNote = "Communicate Task",             Models = new List<Model>()             {new Model(){SubTask = "Email", Duration = "0.5", Notes ="so much junk mail"  },             new Model(){SubTask = "Blogs", Duration = "0.25", Notes ="blogs.msdn.com/delay" },             new Model(){SubTask = "Twitter", Duration = "0.25", Notes ="RT:nothing to report" },}         });          treeviewList.ItemsSource = ManufacturerList;   
Original en ingles

I am working from the answer of this question: Display treeviewitem as grid rows in wpf and I'm struggling to get the items in the tree to be selected. How do you do that with this type of code? Thanks

I've tried making the TextBlocks, TextBoxes instead and had no luck.

<TreeView x:Name="treeviewList"  ItemsSource="{Binding ManufacturerList}">             <TreeView.ItemTemplate>                 <DataTemplate>                     <TreeViewItem  ItemsSource="{Binding Models}">                         <TreeViewItem.Header>                             <Grid Width="350">                                 <Grid.ColumnDefinitions>                                     <ColumnDefinition Width="100"></ColumnDefinition>                                     <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>                                     <ColumnDefinition ></ColumnDefinition>                                 </Grid.ColumnDefinitions>                                 <TextBlock Text="{Binding Task}" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>                                 <TextBlock Text="{Binding durationTotal}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>                                 <TextBlock Text="{Binding HeadNote}" HorizontalAlignment="Left"  VerticalAlignment="Center"  Grid.Column="2"/>                             </Grid>                         </TreeViewItem.Header>                         <TreeViewItem.ItemTemplate>                             <DataTemplate>                                 <Grid Margin="-20,0,0,0">                                     <Grid.ColumnDefinitions>                                         <ColumnDefinition Width="100"></ColumnDefinition>                                         <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>                                         <ColumnDefinition></ColumnDefinition>                                     </Grid.ColumnDefinitions>                                      <TextBlock Text="{Binding SubTask}" Margin="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>                                     <TextBlock Text="{Binding Duration}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>                                     <TextBlock Text="{Binding Notes}" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="2"/>                                 </Grid>                             </DataTemplate>                         </TreeViewItem.ItemTemplate>                     </TreeViewItem>                 </DataTemplate>             </TreeView.ItemTemplate>         </TreeView> 

C# Code

public class Company {     public string Task { get; set; }     public string durationTotal { get; set; }     public string HeadNote { get; set; }     public List<Model> Models { get; set; } } public class Model {     public string SubTask { get; set; }     public string Duration { get; set; }     public string Notes { get; set; }       } 
List<Company> ManufacturerList = new List<Company>();          ManufacturerList.Add(new Company()         {             Task = "Coding",             durationTotal = "4",             HeadNote = "Coding Task",             Models = new List<Model>()             {new Model(){SubTask = "Write", Duration = "2", Notes ="It pays the bills" },             new Model(){SubTask = "Compile", Duration = "1", Notes ="c# or go home" },             new Model(){SubTask = "Test", Duration = "1", Notes ="works on my m/c" },}         });           ManufacturerList.Add(new Company()         {             Task = "Communicate",             durationTotal = "2",             HeadNote = "Communicate Task",             Models = new List<Model>()             {new Model(){SubTask = "Email", Duration = "0.5", Notes ="so much junk mail"  },             new Model(){SubTask = "Blogs", Duration = "0.25", Notes ="blogs.msdn.com/delay" },             new Model(){SubTask = "Twitter", Duration = "0.25", Notes ="RT:nothing to report" },}         });          treeviewList.ItemsSource = ManufacturerList; 
           
     
     

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Sus elementos no se pueden seleccionar porque son simples TextBlocks dentro de un DataTemplate y, como tal, no tiene ningún comportamiento seleccionable. Para que sean seleccionables, deberían ser de tipo TreeViewItem , porque WPF maneja la selección para estos.

No debe plantar TreeView manualmente como lo está haciendo, en su lugar, debe usar HierarchicalDataTemplate para que el TreeView construya su colección de < Código> TreeViewItems Me gusta esto:

  <TreeView ItemsSource="{Binding ManufacturerList}">     <TreeView.Resources>         <HierarchicalDataTemplate DataType="{x:Type wpfapp1:Company}" ItemsSource="{Binding Models}">             <Grid>                 <Grid.ColumnDefinitions>                     <ColumnDefinition Width="100"></ColumnDefinition>                     <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>                     <ColumnDefinition></ColumnDefinition>                 </Grid.ColumnDefinitions>                 <TextBlock Text="{Binding Task}" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>                 <TextBlock Text="{Binding durationTotal}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>                 <TextBlock Text="{Binding HeadNote}" HorizontalAlignment="Left"  VerticalAlignment="Center"  Grid.Column="2"/>             </Grid>         </HierarchicalDataTemplate>         <DataTemplate DataType="{x:Type wpfapp1:Model}">             <Grid>                 <Grid.ColumnDefinitions>                     <ColumnDefinition Width="80"></ColumnDefinition>                     <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>                     <ColumnDefinition ></ColumnDefinition>                 </Grid.ColumnDefinitions>                 <TextBlock Text="{Binding SubTask}" Margin="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>                 <TextBlock Text="{Binding Duration}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>                 <TextBlock Text="{Binding Notes}" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="2"/>             </Grid>         </DataTemplate>     </TreeView.Resources> </TreeView>   

En cuanto a su necesidad de alineación, codifiqué un Width="80" y un 9988777669 porque ya tenía valores de codificación dura, pero creo que no es la forma de ir (existen soluciones limpiadoras ).

 

Your elements are not selectable because they are simple TextBlocks within a DataTemplate and as such don't have any selectable behavior. For them to be selectable they would need to be of type TreeViewItem, because WPF handles selection for these.

You should not template TreeView manually like you're doing, you should instead use HierarchicalDataTemplate to let the TreeView build its collection of TreeViewItems like this:

<TreeView ItemsSource="{Binding ManufacturerList}">     <TreeView.Resources>         <HierarchicalDataTemplate DataType="{x:Type wpfapp1:Company}" ItemsSource="{Binding Models}">             <Grid>                 <Grid.ColumnDefinitions>                     <ColumnDefinition Width="100"></ColumnDefinition>                     <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>                     <ColumnDefinition></ColumnDefinition>                 </Grid.ColumnDefinitions>                 <TextBlock Text="{Binding Task}" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>                 <TextBlock Text="{Binding durationTotal}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>                 <TextBlock Text="{Binding HeadNote}" HorizontalAlignment="Left"  VerticalAlignment="Center"  Grid.Column="2"/>             </Grid>         </HierarchicalDataTemplate>         <DataTemplate DataType="{x:Type wpfapp1:Model}">             <Grid>                 <Grid.ColumnDefinitions>                     <ColumnDefinition Width="80"></ColumnDefinition>                     <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>                     <ColumnDefinition ></ColumnDefinition>                 </Grid.ColumnDefinitions>                 <TextBlock Text="{Binding SubTask}" Margin="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>                 <TextBlock Text="{Binding Duration}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>                 <TextBlock Text="{Binding Notes}" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="2"/>             </Grid>         </DataTemplate>     </TreeView.Resources> </TreeView> 

As for your alignment need, I hardcoded a Width="80" and a Width="100" because you already had hardcoded values, but I think it's not the way to go (cleaner solutions exist).

 
 
 
 

Relacionados problema

6  ¿Cómo resalto un elemento seleccionado de TreeView con algún color?  ( How do i highlight a treeview selected item with some color ) 
Tengo una vista de árbol en WPF. Quiero un color diferente cuando selecciono el TreeViewItem. ...

1  El árbol Flex no selecciona ("Resalte") losIndIndices seleccionados  ( Flex tree does not selecting highlight the selectedindices ) 
Tengo una matriz de artículos que deben seleccionarse en mi control de árbol. Como puede ver en mi código a continuación, vinculo esta matriz a la propiedad d...

1  Uso de imágenes de línea personalizadas en ASP.NET TreeView Control  ( Using customized line images in asp net treeview control ) 
Cuando uso mis imágenes de línea propia para personalizar el aspecto del control de TreeView, parece haber un problema de representación en la fila de la tabl...

1  C #: Trato con XML, TreeView DataGridView y DataTables  ( C deal with xml treeview datagridview and datatables ) 
Estoy trabajando en un proyecto que extrae datos de un archivo XML y también usa una combinación de árboles de árbol para mostrar los datos. Por ejemplo, depe...

2  TreeView con más de un icono  ( Treeview with more than one icon ) 
Me gustaría poner más de un icono en un TreeView (WinForms, .NET 3.5). He echado un vistazo a este proyecto CodeProject ( http://www.codeproject.com/ KB / Tre...

2  ¿Evitar que un TreeView dispare eventos en VB6?  ( Prevent a treeview from firing events in vb6 ) 
En algún código VB6, tengo un manejador para un evento de colapso de TreeView: Private Sub MyTree_Collapse(ByVal Node as MSComCtlLib.Node) Esto se llam...

0  ¿Hay alguna manera de mostrar solo los nodos de los padres en un árbol de extjs?  ( Is there a way to only show parent nodes in a extjs tree ) 
Quiero mostrar solo los nodos de los padres de un árbol en EXTJS. En mi Datastore también hay nodos de hoja. la salida debe ser como - Carpeta 1 Carpet...

6  Encuentra el nodo de TreeView por valor  ( Find treeview node by value ) 
Todos mis nodos TreeView tienen una identificación única para la profundidad de su nodo. Quiero establecer Checked=True en el nodo de TreeView que coincid...

74  Buscar nodo clics en el menú contextual  ( Find node clicked under context menu ) 
¿Cómo puedo averiguar qué nodo en una lista de árboles se ha activado el menú contextual? Por ejemplo, haga clic con el botón derecho en un nodo y seleccionan...

12  ¿El nivel de un TreeView en WPF?  ( The level of a treeview in wpf ) 
En una aplicación WinForms , el nivel de un int111 está dado por int2 ¿Cuál es el comando correspondiente en wpf ? ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos