2012-05-22 43 views
5

我需要在WPF應用程序中使用樹視圖控件 我創建嵌套數據(具有DataItem類型)並將其分配給樹視圖控件。 創建hierarchicaldatatemplate並將其分配給TreeView控件 添加一個ContextMenu到TreeView控件, 現在我要禁用或啓用的SelectedItem的一個屬性菜單項(它應該是DataItem的,我想)「的IsEnabled」如何啓用/禁用menuitem(在contextmenu中)樹視圖selecteditem

如何解決這個問題?

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

我用下面的方法解決了這個問題。

  1. 上下文菜單創建一個資源

    <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. 創建樹視圖項的風格,並使用上述

    <Style TargetType="{x:Type TreeViewItem}" x:Uid="Style_1"> 
    <Setter x:Uid="Setter_32" Property="ContextMenu" Value="{StaticResource   TreeViewItemContextMenu}"> 
    </Setter> 
    ... 
    </Style> 
    
  3. 上下文菜單資源實現的轉換器。根據上面的標記擴展,傳入的轉換參數是當前選定的項目,因此我可以獲取它的屬性並進行檢查。

感謝您的全力幫助。

回答

1

我已經在WinForm TreeView中使用了它,並且成功的結果。

當聲明DataItems時還包含一個標籤屬性。

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

在TreeView的EventListener上投射sender對象或從TreeView中獲取SelectedItem。

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

類似地,對於發送者對象,

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

至於可以啓用或禁用的MenuItems了「執行代碼」。

注意:您尚未爲ContextMenu標記中的MenuItems聲明x:Name屬性。 請做到這一點訪問MenuItems。

的IsEnabled是啓用或WPF

禁用交互項目直接財產我只是給了算法,因爲,我更多的是VB的人比C#的。所以我不想弄亂代碼。

祝您有美好的一天:)

+0

您還可以在Tag屬性中添加唯一標識符。你可能會問:「我可以使用DataItem的名稱來訪問它們?」但要做到這一點,您要麼將其全球聲明爲朋友,要麼將其用於設計器代碼中。否則,您無法處理該對象。您還可以爲DataItems添加一個顯式的Event Listener來完成這項工作。像往常一樣,程序員和樹上的分支一樣多! –