WPF在TreeView的子项中的TextBlock,触发点击事件时,获得当前文本框所在的TreeViewItem数据对象

要实现的效果是,在一个深层treeview控件的treeviewitem中有个textblock,而我要在点击这个textblock时阻断向下传递(e.handle=true),并且将当前这个项的绑定属性IsExpanded设置相反值

前台代码如下:

后台代码:

核心知识点:

传递到后台的控件对象sender,其绑定的DataContext上下文即是当前treeviewitem的上下文,也就是当前选项的数据上下文,所以只需要拿到控件的上下文,即是当前选项的数据上下文了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个基于WPF和MVVM的示例代码,可以在TreeView添加CheckBox,并在点击CheckBox触发TreeViewItem事件并传递其名称: 首先,定义一个名为`TreeViewItemViewModel`的视图模型类,该类表示TreeView的每个项: ```csharp public class TreeViewItemViewModel : INotifyPropertyChanged { public string Name { get; set; } public ObservableCollection<TreeViewItemViewModel> Children { get; set; } public bool IsChecked { get; set; } public event PropertyChangedEventHandler PropertyChanged; // Constructor public TreeViewItemViewModel(string name, IEnumerable<TreeViewItemViewModel> children = null) { Name = name; Children = children != null ? new ObservableCollection<TreeViewItemViewModel>(children) : null; IsChecked = false; } } ``` 接下来,定义一个名为`MainViewModel`的主视图模型类,该类包含TreeView的所有项和与选项相关的逻辑: ```csharp public class MainViewModel : INotifyPropertyChanged { public ObservableCollection<TreeViewItemViewModel> Items { get; set; } public ICommand ItemSelectedCommand { get; set; } public event PropertyChangedEventHandler PropertyChanged; // Constructor public MainViewModel() { // Create the items for the TreeView Items = new ObservableCollection<TreeViewItemViewModel>() { new TreeViewItemViewModel("Item 1"), new TreeViewItemViewModel("Item 2", new List<TreeViewItemViewModel>() { new TreeViewItemViewModel("Subitem 1"), new TreeViewItemViewModel("Subitem 2"), new TreeViewItemViewModel("Subitem 3") }), new TreeViewItemViewModel("Item 3") }; // Create the command for handling item selection ItemSelectedCommand = new RelayCommand<TreeViewItemViewModel>(ItemSelected); } // Command handler for item selection private void ItemSelected(TreeViewItemViewModel item) { if (item.IsChecked) { MessageBox.Show("Selected item: " + item.Name); } } } ``` 在上面的代码,`MainViewModel`包含一个`Items`属性,该属性表示TreeView的所有项。 `ItemSelectedCommand`是一个`RelayCommand`类型的命令,它将在选项更改被调用。`ItemSelected`是一个方法,它将在选项更改执行。 接下来,将视图绑定到视图模型。以下是一个简单的XAML布局,其包含一个TreeView元素和一个CheckBox元素: ```xml <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:WpfApp1" Title="MainWindow" Height="450" Width="800"> <Window.Resources> <DataTemplate DataType="{x:Type local:TreeViewItemViewModel}"> <StackPanel Orientation="Horizontal"> <CheckBox IsChecked="{Binding IsChecked}" Margin="0,0,5,0" /> <TextBlock Text="{Binding Name}" /> </StackPanel> </DataTemplate> </Window.Resources> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <TreeView Grid.Column="0" ItemsSource="{Binding Items}" /> <CheckBox Grid.Column="1" Content="Select item" IsChecked="{Binding Items[1].Children[0].IsChecked}" /> </Grid> </Window> ``` 在上面的代码, `DataTemplate`定义了如何呈现TreeView的每个项。 `TreeView`元素使用`ItemsSource`属性将TreeView绑定到视图模型的`Items`属性。 `CheckBox`元素绑定到TreeView的特定项的`IsChecked`属性。 最后,创建一个名为`RelayCommand`的简单实用程序类,该类允许将命令绑定到视图模型的方法: ```csharp public class RelayCommand<T> : ICommand { private readonly Action<T> execute; private readonly Func<T, bool> canExecute; public RelayCommand(Action<T> execute, Func<T, bool> canExecute = null) { this.execute = execute ?? throw new ArgumentNullException("execute"); this.canExecute = canExecute; } public bool CanExecute(object parameter) { return canExecute == null || canExecute((T)parameter); } public void Execute(object parameter) { execute((T)parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } } ``` 现在,运行应用程序,您将看到TreeView的每个项都带有一个CheckBox。当选任何一个CheckBox,将弹出一个消息框,其包含所选项的名称。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值