2012-05-22 8 views
5

Tôi cần phải sử dụng kiểm soát treeview trong ứng dụng WPF Tôi tạo dữ liệu lồng nhau (với kiểu DataItem) và gán nó cho kiểm soát treeview. Tạo một hierarchicaldatatemplate và gán nó vào TreeView kiểm soát Thêm một ContextMenu vào TreeView, Bây giờ tôi muốn vô hiệu hóa hoặc kích hoạt các mục menu bằng một tài sản của SelectedItem (nó phải được DataItem, tôi nghĩ), "IsEnabled"Làm thế nào để kích hoạt/vô hiệu hóa menuitem (trong contextmenu) cho một selecteditem của treeview

Làm thế nào để tiếp cận điều đó?

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

Tôi giải quyết vấn đề theo phương pháp sau.

  1. tạo ra một nguồn menu ngữ cảnh

    <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. tạo ra một phong cách cho xem mục cây và sử dụng tài nguyên menu ngữ cảnh trên

    <Style TargetType="{x:Type TreeViewItem}" x:Uid="Style_1"> 
    <Setter x:Uid="Setter_32" Property="ContextMenu" Value="{StaticResource   TreeViewItemContextMenu}"> 
    </Setter> 
    ... 
    </Style> 
    
  3. thực hiện một chuyển đổi. Theo phần mở rộng đánh dấu ở trên, parmeter truyền trong chuyển đổi là mục được chọn hiện tại, vì vậy tôi có thể lấy thuộc tính của nó và thực hiện kiểm tra.

cảm ơn sự giúp đỡ của bạn.

Trả lời

1

Tôi đã sử dụng tính năng này trong WinForm TreeView với kết quả thành công.

Khi khai báo DataItems cũng bao gồm thuộc tính thẻ trong đó.

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

Trên EventListener cho TreeView, truyền đối tượng người gửi hoặc nhận SelectedItem từ TreeView.

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

Tương tự như vậy cho các object sender,

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

Đối với các "mã để thực hiện" bạn có thể kích hoạt hoặc vô hiệu hóa các MenuItems.

LƯU Ý: Bạn chưa khai báo x: Thuộc tính tên cho MenuItems trong Thẻ ContextMenu. Hãy làm điều đó để truy cập MenuItems.

IsEnabled là tài sản trực tiếp cho phép hoặc vô hiệu hóa các mục interactable trong WPF

Tôi chỉ đưa ra các thuật toán bởi vì, tôi là nhiều hơn một chàng trai VB hơn so với C#. SO Tôi không muốn gây rối với các mã.

Chúc một ngày tuyệt vời :)

+0

Bạn cũng có thể thêm số nhận dạng duy nhất trong thuộc tính Thẻ. Bạn có thể hỏi "Tôi có thể sử dụng Tên của DataItem để truy cập chúng?" Nhưng để làm điều đó, bạn khai báo trên toàn cầu với tư cách Bạn bè hoặc bạn sử dụng nó trong Bộ luật thiết kế. Nếu không, bạn không thể xử lý đối tượng đó. Bạn cũng có thể thêm Trình xử lý sự kiện rõ ràng cho DataItems để thực hiện công việc. Như mọi khi, một lập trình viên có nhiều chiến thuật như các nhánh cây! –