TreeViewItem IsExpanded with HierarchialDataTemplate
本文关键字:HierarchialDataTemplate with IsExpanded TreeViewItem | 更新日期: 2023-09-27 18:16:59
我正在尝试为组/用户层次结构设置一个TreeView,其中组可以有用户和子组,子组也有子组和用户,等等。当我从集合中添加/删除用户或组并使用myTreeView.Items.Refresh();
更新视图时,所有扩展的TreeViewItems都会关闭。这对用户来说是不方便的,所以我试图扩展之前扩展的所有TreeViewItems。myTreeView.SelectedItem;
似乎不起作用,它只返回Group
或User
元素而没有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; }
}
提前感谢您的帮助。
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
绑定。给你的类增加了无用的膨胀,但它可以帮助你避免绑定错误。