TreeViewItem IsExpanded with HierarchialDataTemplate

时间:2016-11-09 09:55:07

标签: c# wpf binding treeview

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

  

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

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

我的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;
        }
    }

和我的User类的接口

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; }
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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绑定。将大部分无用的膨胀添加到您的类中,但它可以帮助您避免绑定错误。