WPF TreeView的项无法选择

8

我目前正在使用WPF编写文件夹浏览器对话框。为了显示树形结构,我使用了TreeView:

<TreeView Name="FolderView" ItemsSource="{Binding DataTrees}" Grid.Row="0">
    <TreeView.ItemTemplate>
      <HierarchicalDataTemplate ItemsSource="{Binding Tree}">
      <TreeViewItem IsSelected="{Binding IsSelected, Mode=TwoWay}" IsExpanded="{Binding IsExpanded, Mode=TwoWay}" Header="{Binding Name}" HorizontalAlignment="Left"/>
      </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
  </TreeView>

目前我有三个问题:

  1. 无法在正在运行的程序中选择项目
  2. 标题向右移了约两个选项卡(不是关键问题,但很丑陋)
  3. 'IsExpanded'仅在双击项目时设置,并且不会在单击[+]时设置

我不知道问题出在哪里,请评论并我会更新我的问题!

编辑: Itemsource是一个列表 数据树类:

public class DataTree:INotifyPropertyChanged
{
  private string path;

  private string name;

  private ObservableCollection<DataTree> tree;

  private bool isSelected;

  private bool isExpanded;
}

(不使用属性和实现INotifyPropertyChanged的简单代码)


修改ItemTemplate而不了解内部结构会导致许多问题。您应该使用Expression Blend查看TreeViewItem的内部结构。 - King King
1个回答

13

不要直接将 TreeViewItem 添加到 ItemTemplate 中:

<TreeView Name="FolderView" ItemsSource="{Binding DataTrees}" Grid.Row="0">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">    
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
            <Setter Property="HorizontalAlignment" Value="Left"/>
        </Style>    
    </TreeView.ItemContainerStyle>

    <TreeView.ItemTemplate>
      <HierarchicalDataTemplate ItemsSource="{Binding Tree}">
          <TextBlock Text="{Binding Name}"/>
      </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

与任何ItemsControl一样,TreeView将其数据项包装到项容器中(在您的情况下是TreeViewItem)。因此,诸如选择和展开等操作应通过ItemContainerStyle进行设置。


我之前尝试过,但由于数据上下文问题,Setter Value绑定失败了。 "IsSelected"是TreeView的ItemSource中一个项目的属性,而不是ViewModel的属性。 - Bio42
显然,您需要在“TreeViewItem”的数据上下文中使用“IsSelected”和“IsExpanded”。您的“ItemsSource”中有什么样的项目?在这种情况下,“ViewModel”是什么? - Dennis
是的。Itemsource 是一个 List<DataTree>(我正在添加代码)。ViewModel 是 MVVM 概念中的 ViewModel。 - Bio42
属性在DataContext ViewModel中不存在 - 正如您所猜测的那样,我需要TreeViewItem的数据上下文,但我不知道如何实现。 - Bio42
抱歉,都是我的错,其实并没有问题,只是 ReSharper 提示有一个问题... - Bio42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接