编写一段C#代码 wpf mvvm模式 在TreeView中添加CheckBox 当点击CheckBox时触发选中TreeVIewItem事件 传递其TreeViewItem的name
时间: 2024-02-18 15:01:58 浏览: 172
以下是一个基于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时,将弹出一个消息框,其中包含所选项的名称。
阅读全文