2012-05-22 35 views
5

Necesito usar un control treeview en la aplicación WPF Creo datos anidados (con tipo DataItem) y los asigno al control treeview. Crear un hierarchicaldatatemplate y asignarlo a TreeView control de Añadir un menú contextual a vista de árbol, Ahora quiero para desactivar o activar el elemento de menú mediante una propiedad de SelectedItem (debe ser DataItem, creo), "IsEnabled"Cómo habilitar/deshabilitar menuitem (en menú contextual) para un elemento seleccionado de treeview

¿Cómo abordar eso?

  <HierarchicalDataTemplate x:Key="dt" ItemsSource="{Binding Items}"> 
       <TextBlock x:Uid="TextBlock_2" Text="{Binding Name}"> 
       </TextBlock> 
      </HierarchicalDataTemplate> 

     <TreeView x:Name="tree_3" Height="200" 
        ItemTemplate="{StaticResource dt}" 
        > 
      <TreeView.ContextMenu> 
       <ContextMenu> 
        <MenuItem ItemsSource="{Binding SelectedItem}" 
         Header="doA" IsEnabled="{Binding IsEnabled, Mode=OneWay}" /> 
        <MenuItem Header="doB" IsEnabled="False"/> 
        <MenuItem Header="doC" /> 
       </ContextMenu> 
      </TreeView.ContextMenu> 
     </TreeView> 

class DataItem : DependencyObject //INotifyPropertyChanged 
{ 
    private List<DataItem> _items = new List<DataItem>(); 
    public List<DataItem> Items 
    { 
     get 
     { 
      return _items; 
     } 
    } 

    public string Name { get; set; } 
    public int Category { get; set; } 
    public bool IsEnabled { get; set; } 
} 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     List<DataItem> allData = new List<DataItem>(); 

     DataItem i1 = new DataItem() { Name = "Test1", Category = 1, IsEnabled = false }; 
     DataItem i2 = new DataItem() { Name = "Test2", Category = 2, IsEnabled = false }; 
     DataItem i3 = new DataItem() { Name = "Test3", Category = 3, IsEnabled = true }; 

     DataItem t1 = new DataItem() { Name = "Template 1", Category = 1, IsEnabled = true }; 
     DataItem t2 = new DataItem() { Name = "Template 2", Category = 1, IsEnabled = false }; 

     i1.Items.Add(t1); 
     i1.Items.Add(t2); 

     allData.Add(i1); 
     allData.Add(i2); 
     allData.Add(i3); 
     tree_3.ItemsSource = allData; 
    } 

Resolví el problema con el siguiente método.

  1. crear un recurso de menú contextual

    <ContextMenu x:Uid="ContextMenu_1" x:Key="TreeViewItemContextMenu" 
         ItemsSource="{Binding}"> 
        <MenuItem x:Uid="MenuItem_1" 
          Header="Rename" 
          IsEnabled="{Binding Path=., Converter={StaticResource renameMenuConverter}}" 
          Click="RenameMenu_OnClick" 
          /> 
    </ContextMenu> 
    
  2. crear un estilo para el elemento de vista de árbol y mediante el recurso de menú contexto anterior

    <Style TargetType="{x:Type TreeViewItem}" x:Uid="Style_1"> 
    <Setter x:Uid="Setter_32" Property="ContextMenu" Value="{StaticResource   TreeViewItemContextMenu}"> 
    </Setter> 
    ... 
    </Style> 
    
  3. implementar un convertidor. De acuerdo con la extensión de marcado anterior, el parmetro pasado en convertir es el elemento seleccionado actual, por lo que puedo obtener la propiedad del mismo y hacer la verificación.

gracias por toda su ayuda.

Respuesta

1

Lo he usado en WinForm TreeView con resultados satisfactorios.

Al declarar los elementos de datos también incluyen una propiedad de etiqueta en ellos.

DataItem i1 = new DataItem() { Name = "Test1", 
        Category = 1, IsEnabled = false, Tag = "Test1" }; 

En el EventListener para TreeView, emite el objeto del remitente u obtén SelectedItem del TreeView.

//It is only Algorithm: 
if treeview1.selecedItem.Tag = "Test1" then 
    //code for execution 
end if 

mismo modo para el objeto emisor,

//It is only Algorithm: 
variable treeNode = cast (sender to TreeView).SelectedItem 
if treeNode.Tag = "Test1" then 
    //code for execution 
end if 

En cuanto al "código para la ejecución" se puede activar o desactivar la MenuItems.

NOTA: No ha declarado el atributo x: Name para los elementos de menú en la etiqueta ContextMenu. Hágalo para acceder a los artículos del menú.

IsEnabled es propiedad directa para habilitar o deshabilitar los elementos interactable en WPF

que acabo de dar el algoritmo, ya que, yo soy más de un tipo de VB a C#. Así que no quiero meterme con los códigos.

Tenga un gran día :)

+0

También puede agregar identificadores únicos en la propiedad Etiqueta. Puede preguntar "¿Puedo usar el Nombre del DataItem para acceder a ellos?" Pero para hacer eso, o bien los declaras Globalmente como Amigo o lo usas en el Código de Diseñador. De lo contrario, no puedes manejar ese objeto. También puede agregar un Escuchador de eventos explícito para los DataItems para hacer el trabajo. Como siempre, un programador tiene tantas tácticas como ramas en un árbol. –

Cuestiones relacionadas