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