【问题标题】:How to access DataTemplate item from target type in wpf如何从 wpf 中的目标类型访问 DataTemplate 项
【发布时间】:2016-06-26 01:42:38
【问题描述】:
<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。

如果我说这一切都错了,请告诉我。如果您需要更多信息,我很乐意提供。

【问题讨论】:

    标签: c# wpf xaml treeview datatemplate


    【解决方案1】:

    您可以通过 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>
    

    访问ItemViewModel的IsChecked属性设置或获取CheckBox的值。

    【讨论】:

    • 我想我可以使用它并让它做我需要做的事情:) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多