【问题标题】:Why are my TreeViewItems acting like RadioButtons?为什么我的 TreeViewItems 表现得像 RadioButtons?
【发布时间】: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 更改为CheckBoxToggleButton(正是您想要实现的目标)来添加多选。只需将Style 删除为TreeViewItem
  • 谢谢。这回答了我的问题 - 如果您想提交答案,我会标记它。
  • 我已经添加了answer 以及一些额外的解释

标签: wpf wpf-controls


【解决方案1】:

在您的Style for TreeViewItem 中,您将TreeViewItem.IsSelected 绑定到您的视图模型的IsSelected 属性,这基本上意味着如果选择了TreeViewItem,则将检查CheckBox。之所以会这样,是因为 WPF TreeView 不支持多选。

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

  • 您点击选择一项
  • 以前的TreeViewItem.IsSelected 设置为假
  • 这是由IsSelected 传递给您的视图模型的
  • 然后传回CheckBox.IsChecked
  • 新的TreeViewItem.IsSelected 设置为真
  • 等等

TreeViewItem 删除Style,只留下CheckBox.IsCheckedIsSelected 的绑定

附带说明,当您只想显示一个元素(如 CheckBox)时,不需要 StackPanel

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 2012-07-19
      相关资源
      最近更新 更多