如何从 wpf 中的目标类型访问 DataTemplate 项
How to access DataTemplate item from target type in wpf
<TreeView x:Name="foldersItem">
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Name="cbItem"></CheckBox>
<TextBlock Text="{Binding}" Margin="5,0" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
</TreeView>
基本上我在上面的代码中有一个 TreeView,每个 TreeViewItem 都有一个复选框和一个文本块。如何访问、选中或取消选中每个 TreeViewItem 的复选框?
我猜我需要某种绑定,但我无法确定是什么或如何绑定。
最终结果应该有一个 Windows 表单类型的 TreeView,复选框分别设置为 true false 或 null。
如果我做错了,请告诉我。如果您需要更多信息,我很乐意提供。
您可以通过 ItemsControl 的典型数据绑定模式设置或获取 CheckBox 的值。下面是一个最小的例子。
后面的代码:
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public ObservableCollection<ItemViewModel> Items { get; } =
new ObservableCollection<ItemViewModel>
{
new ItemViewModel { Name = "Item1", IsChecked = null },
new ItemViewModel { Name = "Item2", IsChecked = true },
new ItemViewModel { Name = "Item3", IsChecked = false }
};
}
public class ItemViewModel : INotifyPropertyChanged
{
public string Name { get; set; }
private bool? _isChecked;
public bool? IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
OnPropertyChanged(nameof(IsChecked));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="WindowRoot"
Title="MainWindow" Height="300" Width="400">
<Grid>
<TreeView ItemsSource="{Binding ElementName=WindowRoot, Path=Items}">
<TreeView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</Window>
访问 IsChecked
属性 的 ItemViewModel 以设置或获取 CheckBox 的值。
<TreeView x:Name="foldersItem">
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Name="cbItem"></CheckBox>
<TextBlock Text="{Binding}" Margin="5,0" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
</TreeView>
基本上我在上面的代码中有一个 TreeView,每个 TreeViewItem 都有一个复选框和一个文本块。如何访问、选中或取消选中每个 TreeViewItem 的复选框? 我猜我需要某种绑定,但我无法确定是什么或如何绑定。 最终结果应该有一个 Windows 表单类型的 TreeView,复选框分别设置为 true false 或 null。
如果我做错了,请告诉我。如果您需要更多信息,我很乐意提供。
您可以通过 ItemsControl 的典型数据绑定模式设置或获取 CheckBox 的值。下面是一个最小的例子。
后面的代码:
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public ObservableCollection<ItemViewModel> Items { get; } =
new ObservableCollection<ItemViewModel>
{
new ItemViewModel { Name = "Item1", IsChecked = null },
new ItemViewModel { Name = "Item2", IsChecked = true },
new ItemViewModel { Name = "Item3", IsChecked = false }
};
}
public class ItemViewModel : INotifyPropertyChanged
{
public string Name { get; set; }
private bool? _isChecked;
public bool? IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
OnPropertyChanged(nameof(IsChecked));
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="WindowRoot"
Title="MainWindow" Height="300" Width="400">
<Grid>
<TreeView ItemsSource="{Binding ElementName=WindowRoot, Path=Items}">
<TreeView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding IsChecked}"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</Window>
访问 IsChecked
属性 的 ItemViewModel 以设置或获取 CheckBox 的值。