为什么我的TreeView项目就像Radio Buttons?

时间:2014-05-30 20:40:51

标签: wpf wpf-controls

我有一个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会改变另一个项目的状态?

:'(

2 个答案:

答案 0 :(得分:0)

你尝试删除你的风格?然后,您应该看到多个选择

答案 1 :(得分:0)

Style TreeViewItem TreeViewItem.IsSelected中,您绑定IsSelectedCheckBox属性的视图模式,这基本上意味着TreeViewItem将被检查TreeView已被选中。之所以如此,是因为WPF TreeViewItem不支持多选。

您可以通过将CheckBox内容更改为ToggleButtonTreeViewItem.IsSelected来轻松添加多项选择,这正是您要尝试实现的内容,但是您无法将TreeViewItem.IsSelected绑定到IsSelected你的视图模型。 目前发生的是

  • 您点击以选择一个项目
  • 之前的CheckBox.IsChecked设置为false
  • 通过TreeViewItem.IsSelected
  • 将其传递给您的视图模型
  • 然后传回Style
  • new TreeViewItem设置为true

删除CheckBox.IsChecked的{​​{1}},仅将IsSelected保留为StackPanel绑定

在旁注上,当您只想显示CheckBox

这样的元素时,您不需要{{1}}