【问题标题】:TreeViewItem IsExpanded with HierarchialDataTemplateTreeViewItem IsExpanded 与 HierarchialDataTemplate
【发布时间】:2016-11-09 09:55:06
【问题描述】:

我正在尝试为组/用户层次结构设置 TreeView,其中组可以有用户和子组,子组也可以有子组和用户,依此类推。当我从集合中添加/删除用户或组并使用myTreeView.Items.Refresh(); 更新视图时,所有展开的 TreeViewItems 都会关闭。这对用户来说很不方便,所以我正在尝试扩展之前扩展的所有 TreeViewItem。 myTreeView.SelectedItem; 似乎不起作用,它只返回一个GroupUser 元素没有TreeViewItem 元素。 现在,我在WPF DataBound treeview expand / collapse 找到了一些我尝试过的东西,但是编译器现在告诉我这个

BindingExpression 路径错误:在“对象”“用户”上找不到“IsNodeExpanded”属性

用户无法扩展,因此在用户类中实现此字段没有意义。 我究竟做错了什么?这甚至是正确的方法吗?

我的 TreeView 有以下设置

<TreeView Grid.Column="0" Name="myTreeView" SelectedItemChanged="myTreeView_SelectedItemChanged" MouseDoubleClick="myTreeView_MouseDoubleClick">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type datatypes:Group}" ItemsSource="{Binding Items, UpdateSourceTrigger=PropertyChanged}">
                <TextBlock Text="{Binding Name}" FontWeight="Bold"/>
            </HierarchicalDataTemplate>
            <DataTemplate DataType="{x:Type datatypes:User}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding LicenceUser}"/>
                </StackPanel>
            </DataTemplate>
            <Style TargetType="TreeViewItem">
                <Setter Property="IsExpanded" Value="{Binding IsNodeExpanded, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
            </Style>
        </TreeView.Resources>
    </TreeView>

为了更好的可见性,我只在此处复制我的类的接口。

这里是我的 Group 类的接口

interface IGroup {
    int ID { get; set; }
    string Name { get; set; }
    string Gruppe { get; set; }
    string Path { get; set; }
    Users Users { get; set; }
    ObservableCollection<object> Items { get; }
    bool IsNodeExpanded { get; set; }
    Groups SubGroups { get; set; }
}

Group 类中的 Items Collection 如下所示

public ObservableCollection<object> Items {
        get {
            ObservableCollection<object> childItems = new ObservableCollection<object>();
            foreach (Group item in SubGroups) {
                childItems.Add(item);
            }
            foreach (User item in Users) {
                childItems.Add(item);
            }
            return childItems;
        }
    }

以及我的用户类的接口

interface IUser {
    string UserID { get; set; }
    string LicenceUser { get; set; }
    string MailAddress { get; set; }
    string ComputerName { get; set; }
    string HardDriveID { get; set; }
    string Group { get; set; }
    string Path { get; set; }
}

提前感谢您的帮助。

【问题讨论】:

    标签: c# wpf binding treeview


    【解决方案1】:

    IsExpanded 的设置器适用于所有TreeViewItems,无论它们是用户还是组。它不应该阻止你编译;它只会在运行时的调试输出中为您提供一堆绑定错误。

    如果这不可接受,最适合您的情况的解决方案是制作一个转换器来区分用户和组,并为前者返回 false(例如 IsExpanded="{Binding Path=., Converter={StaticResource ItemToBooleanConverter}}"

    public class ItemToBooleanConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is User)
                return false;
            return ((Group)value).IsNodeExpanded;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    编辑:这似乎不适用于双向绑定。我在类似情况下所做的是添加 ITypeProvider 和一个 Type 属性,以便我可以区分 XAML 中的类型。 DataTrigger 可以仅为特定数据类型设置IsExpanded 绑定。为您的类添加大部分无用的膨胀,但它可以帮助您避免绑定错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多