使用HierarchialDataTemplate扩展TreeViewItem

斯塔兰塔尔

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

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

无法扩展User,因此在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; }
}

在此先感谢您的帮助。

布兰登·胡德

的设置器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中的类型。A只能为特定数据类型DataTrigger设置IsExpanded绑定。给您的类增加了大部分无用的膨胀,但是它可以帮助您避免绑定错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章