我正在尝试为组/用户层次结构设置TreeView,其中组可以包含用户和子组,子组也可以包含子组和用户,依此类推。当我从集合中添加/删除用户或组并使用myTreeView.Items.Refresh();
更新视图时,所有展开的TreeViewItem都将关闭。这对用户来说不方便,所以我试图扩展之前扩展的所有TreeViewItem。 myTreeView.SelectedItem;
似乎不起作用,它只返回Group
或User
元素没有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; }
}
提前感谢您的帮助。
答案 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
绑定。将大部分无用的膨胀添加到您的类中,但它可以帮助您避免绑定错误。