Ich brauche ein Treeview-Steuerelement in der WPF-Anwendung Ich erstelle verschachtelte Daten (mit dem Typ DataItem) und sie TreeView-Steuerelement zuweisen. Erstellen eine HierarchicalDataTemplate und ordnen sie die Steuerung an TreeView ein contextmenu In den TreeView, Jetzt will ich deaktivieren oder den Menüpunkt aktivieren, indem Sie eine Eigenschaft SelectedItem (es sollte DataItem sein, glaube ich), „IsEnabled“So aktivieren/deaktivieren Sie Menüeintrag (im Kontextmenu) für ein ausgewähltes Element von treeview
Wie geht man das an?
<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;
}
Ich löste das Problem mit der folgenden Methode.
ein Kontextmenü Ressource erstellen
<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>
einen Stil für die Baumansicht Artikel erstellen und über das Kontextmenü Ressource unter Verwendung der oben
<Style TargetType="{x:Type TreeViewItem}" x:Uid="Style_1"> <Setter x:Uid="Setter_32" Property="ContextMenu" Value="{StaticResource TreeViewItemContextMenu}"> </Setter> ... </Style>
einen Konverter implementieren. Entsprechend der obigen Markup-Erweiterung ist der in convert übergebene Parameter der aktuell ausgewählte Eintrag, sodass ich die Eigenschaft davon abrufen und die Überprüfung durchführen kann.
danke für Ihre Hilfe.
Sie können auch eindeutige Bezeichner in der Tag-Eigenschaft hinzufügen. Sie können fragen: "Ich kann den Namen des DataItem verwenden, um auf sie zuzugreifen?" Um das zu tun, deklarierst du sie entweder global als Freund oder du verwendest sie im Designer-Code. Andernfalls können Sie dieses Objekt nicht behandeln. Sie können auch einen expliziten Ereignis-Listener für die DataItems hinzufügen, um den Job auszuführen. Wie immer hat ein Programmierer so viele Taktiken wie Zweige in einem Baum! –