我有一个WPF TreeView,我已经在幕后实现了一个小模型类。在创建控件时,我将它们的列表绑定到TreeView的ItemsSource。 (为了简单起见,我在这里略微削减了代码,但它应该是可重复的。)
public class TreeViewItemModel
{
public ObservableCollection<TreeViewItemModel> Children { get; set; }
public string Name { get; set; }
public bool IsSelected { get; set; }
public TreeViewItemModel()
{
Children = new ObservableCollection<TreeViewItemModel>();
IsSelected = false;
}
}
public partial class MainWindow : Window
{
public ObservableCollection<TreeViewItemModel> MyTree { get; set; }
public MainWindow()
{
InitializeComponent();
// Add some dummy values
List<TreeViewItemModel> items = new List<TreeViewItemModel>();
for (int i = 0; i < 10; i++) items.Add(new TreeViewItemModel() { Name = ("Node" + i) });
MyTree = new ObservableCollection<TreeViewItemModel>(items);
DataContext = this;
}
}
我的TreeViewItems本身包含复选框。现在,我喜欢做的是将IsSelected绑定到复选框,以便在一天结束时(希望)有一个TreeViewItemModel类的列表,IsSelected设置为是否复选框检查。
为此,我有这种风格:
<Style x:Key="{x:Type TreeViewItem}" TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
和这个TreeView声明:
<TreeView ItemsSource="{Binding MyTree}" >
<TreeView.Resources>
<DataTemplate DataType="{x:Type UI:TreeViewItemModel}">
<StackPanel Orientation="Horizontal">
<CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}" />
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
这几乎有效。我可以通过编程方式创建项目列表,然后绑定到TreeView,检查TreeView中的项目,当我在C#中检查它们时,IsSelected设置得恰当。
除了一件事:我的TreeViewItems都像RadioButtons一样。我单击一个,它将IsSelected设置为true。我很高兴!但后来我点击另一个......它取消选择第一个TreeViewItem !我一次不能选择多个。
但是......为什么?!我根本不明白。它们都绑定在后端的不同项目上,为什么设置IsSelected会改变另一个项目的状态?
:'(
答案 0 :(得分:0)
你尝试删除你的风格?然后,您应该看到多个选择
答案 1 :(得分:0)
在Style
TreeViewItem
TreeViewItem.IsSelected
中,您绑定IsSelected
到CheckBox
属性的视图模式,这基本上意味着TreeViewItem
将被检查TreeView
已被选中。之所以如此,是因为WPF TreeViewItem
不支持多选。
您可以通过将CheckBox
内容更改为ToggleButton
或TreeViewItem.IsSelected
来轻松添加多项选择,这正是您要尝试实现的内容,但是您无法将TreeViewItem.IsSelected
绑定到IsSelected
你的视图模型。
目前发生的是
CheckBox.IsChecked
设置为false TreeViewItem.IsSelected
Style
TreeViewItem
设置为true 删除CheckBox.IsChecked
的{{1}},仅将IsSelected
保留为StackPanel
绑定
在旁注上,当您只想显示CheckBox