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.
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>
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>
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.
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. –