2012-05-22 3 views
5

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.

  1. 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> 
    
  2. 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> 
    
  3. 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.

Antwort

1

Ich habe dies in WinForm TreeView mit erfolgreichen Ergebnissen verwendet.

Bei der Deklaration der DataItems enthalten auch eine Tag-Eigenschaft in ihnen.

Konvertieren Sie auf dem EventListener für die TreeView das sender-Objekt, oder rufen Sie SelectedItem aus der TreeView ab.

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

Ebenso für das Senderobjekt,

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

Wie für den "Code zur Ausführung" Sie die MenuItems aktivieren oder deaktivieren können.

HINWEIS: Sie haben das x: Name-Attribut für die MenuItems im ContextMenu-Tag nicht deklariert. Bitte tun Sie das, um auf die MenuItems zuzugreifen.

IsEnabled ist die direkte Eigenschaft zur Aktivierung oder die interagierbare Elemente in WPF zu deaktivieren

Ich habe nur den Algorithmus, weil ich mehr von einem VB-Typ bin als C#. Also ich möchte nicht mit den Codes zu tun haben.

Einen schönen Tag haben :)

+0

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