我创建了一个Treeview,并使用堆栈面板为树中的每个节点包含一个复选框,图标图像和文本。 这些节点是在运行时创建的。 我也有一个按钮对象。 xaml在下面。
我遇到的问题是,当点击click me按钮时,我需要遍历树视图,如果选中了复选框,则执行一些功能。
是否有人知道如何检查树中节点的复选框是否已从C#代码后面查看
<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>
答案 0 :(得分:7)
我会使用Check Box的IsChecked属性创建一个双向数据绑定到ViewModel对象。比导航树容易得多。
修改(根据人的要求提供):
这是一个示例视图模型(非常简单,仅考虑IsChecked属性):
public class ViewModel : System.ComponentModel.INotifyPropertyChanged
{
private bool? _isChecekd;
public bool? IsChecked
{
get { return _isChecekd; }
set
{
if (_isChecekd != value)
{
_isChecekd = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("IsChecked"));
}
}
}
}
#region INotifyPropertyChanged Members
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
#endregion
}
现在您有一个实现INotifyPropertyChanged的对象,您可以将UI元素属性绑定到它们。因此,您需要将CheckBox的IsChecked属性更新为此属性。要做到这一点,首先必须以某种方式设置Window1的DataContext(或者您也可以在TreeView本身上执行此操作)。在Window1.xaml.cs中:
public Window1()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
然后,在Window1.xaml文件中,更新CheckBox IsChecked属性:
<CheckBox VerticalAlignment="Center" Name="SelectedCheckBox" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
然后,无论你需要什么代码来查询IsChecked的当前值,你都可以这样做(假设这个是Window1):
((ViewModel)this.DataContext).IsChecked
希望有所帮助!
答案 1 :(得分:1)
我认为Tony Heupel的答案是最好的方法,但要了解它,您需要了解MVVM(Model-View-ViewModel)设计模式。我建议你阅读excellent article by Josh Smith