TreeViewItem IsExpanded with HierarchialDataTemplate

本文关键字:HierarchialDataTemplate with IsExpanded TreeViewItem | 更新日期: 2023-09-27 18:16:59

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

BindingExpression路径错误:'IsNodeExpanded'属性在'object' " User "上找不到

User不能扩展,所以在User类中实现这个字段是没有意义的。我做错了什么?这是正确的方法吗?

我有以下设置为我的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; }
}

提前感谢您的帮助。

TreeViewItem IsExpanded with HierarchialDataTemplate

IsExpanded的setter适用于所有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绑定。给你的类增加了无用的膨胀,但它可以帮助你避免绑定错误。

相关文章:
  • 没有找到相关文章