2012-05-22 20 views
5

Ho bisogno di usare un controllo di controllo ad albero nell'applicazione WPF Creo i dati annidati (con tipo DataItem) e assegnarlo al controllo ad albero. Creare un hierarchicaldatatemplate e assegnarlo a controllo TreeView Aggiungi un contextmenu a TreeView, Ora voglio per disattivare o attivare la voce di menu da una proprietà di SelectedItem (dovrebbe essere DataItem, credo), "IsEnabled"Come abilitare/disabilitare menuitem (nel menu di scelta rapida) per un elemento selezionato di treeview

Come avvicinarsi a questo?

  <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; 
    } 

Ho risolto il problema con il seguente metodo.

  1. creare una risorsa menu contestuale

    <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. creare uno stile per l'elemento struttura ad albero e utilizzando la risorsa menu di contesto di cui sopra

    <Style TargetType="{x:Type TreeViewItem}" x:Uid="Style_1"> 
    <Setter x:Uid="Setter_32" Property="ContextMenu" Value="{StaticResource   TreeViewItemContextMenu}"> 
    </Setter> 
    ... 
    </Style> 
    
  3. implementare un convertitore. Secondo l'estensione di markup sopra, il parmeter passato in convert è l'elemento selezionato corrente, quindi posso ottenere la proprietà di esso e fare il controllo.

grazie per tutto il vostro aiuto.

risposta

1

Ho usato questo in WinView TreeView con risultati positivi.

Quando si dichiara che i DataItem includono anche una proprietà tag in essi.

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

Sulla EventListener per la TreeView, object sender lanciare o ottenere il SelectedItem dal TreeView.

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

Analogamente per l'oggetto mittente,

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

quanto riguarda il "codice per l'esecuzione" è possibile attivare o disattivare le MenuItems.

NOTA: non è stato dichiarato l'attributo x: Name per i MenuItem nel tag ContextMenu. Si prega di farlo per accedere ai MenuItems.

IsEnabled è la proprietà diretta per abilitare o disabilitare le voci interactable in WPF

ho appena dato l'algoritmo perché, io sono più di un ragazzo di VB C#. Quindi non voglio rovinare i codici.

Buona giornata :)

+0

È inoltre possibile aggiungere identificatori univoci nella proprietà Tag. Puoi chiedere "Posso usare il Nome di DataItem per accedervi?" Ma per farlo, dichiarali globalmente come amici o li usi nel codice del designer. Altrimenti non puoi gestire quell'oggetto. È inoltre possibile aggiungere un listener di eventi esplicito per DataItems per eseguire il lavoro. Come sempre un programmatore ha tante tattiche come i rami di un albero! –

Problemi correlati