WPF Treeview-获取复选框的状态

WPF Treeview-获取复选框的状态,wpf,treeview,checkbox,Wpf,Treeview,Checkbox,我创建了一个树视图,并使用堆栈面板为树中的每个节点包含复选框、图标图像和文本。 这些节点是在运行时创建的。 我还有一个按钮对象。 xaml在下面 我遇到的问题是,当单击“单击我”按钮时,我需要遍历树视图,如果选中复选框,则执行一些功能 是否有人知道如何从C#code behind中找出是否选中了树中某个节点的复选框?? <Window x:Class="WPF_Explorer_Tree.Window1" xmlns="http://schemas.microsoft.com/winfx/

我创建了一个树视图,并使用堆栈面板为树中的每个节点包含复选框、图标图像和文本。 这些节点是在运行时创建的。 我还有一个按钮对象。 xaml在下面

我遇到的问题是,当单击“单击我”按钮时,我需要遍历树视图,如果选中复选框,则执行一些功能

是否有人知道如何从C#code behind中找出是否选中了树中某个节点的复选框??

<Window x:Class="WPF_Explorer_Tree.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPF_Explorer_Tree" 
Title="KryptoG" Height="424" Width="815" Loaded="Window_Loaded">
<Window.Resources>
    <local:HeaderConverter x:Key="formatter" />
</Window.Resources>
<Grid>
    <TreeView x:Name="foldersItem" SelectedItemChanged="foldersItem_SelectedItemChanged" Background="#FFFFFFFF" BorderBrush="#FFFFFFFF" Foreground="#FFFFFFFF" Margin="0,0,236,112" AllowDrop="True" Visibility="Visible">
        <TreeView.Resources>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="HeaderTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel Name="ST" Orientation="Horizontal">
                                <CheckBox VerticalAlignment="Center"  Name="SelectedCheckBox" IsChecked="False"  Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
                            <Image Name="img"  Width="20"  Stretch="Fill" 
                                   Source="{Binding 
                                   RelativeSource={RelativeSource 
                                   Mode=FindAncestor, 
                                   AncestorType={x:Type TreeViewItem}}, 
                                   Path=Header, 
                                   Converter={x:Static local:HeaderToImageConverter.InstanceIcon}}"       
                                   />
                                <TextBlock VerticalAlignment="Center" Text="{Binding 
                                   RelativeSource={RelativeSource 
                                   Mode=FindAncestor, 
                                   AncestorType={x:Type TreeViewItem}}, 
                                   Path=Header, 
                                   Converter={StaticResource formatter}}" 
                                     />
                            </StackPanel>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.Resources>
    </TreeView>
    <TreeView HorizontalAlignment="Right" Margin="0,0,12,12" Name="treeView1" Width="204" AllowDrop="True" BorderBrush="White" Foreground="White" />
    <Button Height="23" HorizontalAlignment="Left" Margin="12,0,0,70" Name="button1" VerticalAlignment="Bottom" Width="75" Click="button1_Click">Click Me</Button>
    <Button Height="23" HorizontalAlignment="Left" Margin="267,0,0,69" Name="button2" VerticalAlignment="Bottom" Width="75" Click="button2_Click">Click Me too</Button>
</Grid>

点击我
也点击我

我将使用该复选框的IsChecked属性创建一个双向数据绑定,以替代ViewModel对象。比在树上导航容易得多


编辑(根据询问者的请求):

下面是一个示例视图模型(非常简单,只考虑IsChecked属性):

现在您有了一个实现INotifyPropertyChanged的对象,您可以将UI元素属性绑定到它们。因此,您需要将复选框的IsChecked属性更新为此属性。要做到这一点,您首先必须以某种方式设置Window1的DataContext(或者您也可以在TreeView本身上进行设置)。在Window1.xaml.cs中:

public Window1()
        {
            InitializeComponent();
            this.DataContext = new ViewModel();
        }
然后,在Window1.xaml文件中,更新复选框IsChecked属性:

<CheckBox VerticalAlignment="Center"  Name="SelectedCheckBox" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}"  Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />

希望有帮助

我将使用该复选框的IsChecked属性创建一个双向数据绑定到ViewModel对象。比在树上导航容易得多


编辑(根据询问者的请求):

下面是一个示例视图模型(非常简单,只考虑IsChecked属性):

现在您有了一个实现INotifyPropertyChanged的对象,您可以将UI元素属性绑定到它们。因此,您需要将复选框的IsChecked属性更新为此属性。要做到这一点,您首先必须以某种方式设置Window1的DataContext(或者您也可以在TreeView本身上进行设置)。在Window1.xaml.cs中:

public Window1()
        {
            InitializeComponent();
            this.DataContext = new ViewModel();
        }
然后,在Window1.xaml文件中,更新复选框IsChecked属性:

<CheckBox VerticalAlignment="Center"  Name="SelectedCheckBox" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}"  Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />

希望有帮助

我认为Tony Heupel的答案是最好的方法,但要理解它,您需要了解MVVM(模型-视图-视图-模型)设计模式。我建议您阅读此

我认为Tony Heupel的答案是最好的方法,但要理解它,您需要了解MVVM(模型-视图-视图-模型)设计模式。我建议您阅读此

您在TreeView中放置了哪些项目?TreeView项目。这就是答案吗?如果没有,请告诉我您还需要哪些其他信息。您在TreeView中放置了哪些项目?TreeView项目。这就是答案吗?如果没有,请告诉我您还需要哪些其他信息。