【发布时间】:2014-05-30 20:40:51
【问题描述】:
我有一个 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 会改变另一个项目的状态?
:'(
【问题讨论】:
-
因为您在视图模型中将
TreeViewItem.IsSelected绑定到IsSelected,这基本上意味着如果选择了TreeViewItem,则会检查CheckBox -
所以听起来我误解了 IsSelected 的用途,它只适用于 TreeView 中的一件事?
-
WPF
TreeView不支持多选。您可以通过将TreeViewItem更改为CheckBox或ToggleButton(正是您想要实现的目标)来添加多选。只需将Style删除为TreeViewItem -
谢谢。这回答了我的问题 - 如果您想提交答案,我会标记它。
-
我已经添加了answer 以及一些额外的解释
标签: wpf wpf-controls