我尝试将TreeViewItems的isExpanded属性绑定到视图模型的属性。不幸的是,它似乎没有用。
以下是设置:
树:
<TreeView Name="treeView" ItemsSource="{Binding}" Grid.Column="0">
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Expanded, Mode=TwoWay}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
DataContext是从后面的代码设置的。
Hierarchichal数据模板:
<HierarchicalDataTemplate DataType="{x:Type this:StructuredViewNode}" ItemsSource="{Binding Children}">
<!-- content omitted -->
</HierarchicalDataTemplate>
节点:
public class Node : INotifyPropertyChanged
{
// Rest of node omitted
#region Expanded
private bool _isExpanded;
public bool Expanded
{
get { return _isExpanded; }
set
{
throw new Exception("Set to: " + value);
_isExpanded = value;
// Call OnPropertyChanged whenever the property is updated
OnPropertyChanged("Expanded");
}
}
#endregion
}
最后 StructuredViewNode :
public class StructuredViewNode : Node
{
//content omitted
}
当我展开一个节点时,我会想到一个异常,但是该属性似乎没有在viewmodel中设置,你知道为什么吗?
提前致谢!
答案 0 :(得分:1)
我尝试使用树视图重现您的问题,但它对我有用,并在扩展节点时引发错误。 你要么以某种方式吃掉那个错误,要么你的版本有不同的东西 - 在代码中你还没有发布。 我的标记类似,我将Families绑定到treeview的itemssource并且具有完全相同的itemcontainerstyle。
我的代码:
public ObservableCollection<Family> Families { get; set; }
public MainWindowViewModel()
{
Families = new ObservableCollection<Family>();
Family family1 = new Family() { Name = "The Doe's" };
family1.Members.Add(new FamilyMember() { Name = "John Doe", Age = 42 });
family1.Members.Add(new FamilyMember() { Name = "Jane Doe", Age = 39 });
family1.Members.Add(new FamilyMember() { Name = "Sammy Doe", Age = 13 });
Families.Add(family1);
Family family2 = new Family() { Name = "The Moe's" };
family2.Members.Add(new FamilyMember() { Name = "Mark Moe", Age = 31 });
family2.Members.Add(new FamilyMember() { Name = "Norma Moe", Age = 28 });
Families.Add(family2);
}
}
public class Family :baseVM
{
public Family()
{
this.Members = new ObservableCollection<FamilyMember>();
}
public string Name { get; set; }
public ObservableCollection<FamilyMember> Members { get; set; }
private bool _isExpanded;
public bool Expanded
{
get { return _isExpanded; }
set
{
throw new Exception("Set to: " + value);
_isExpanded = value;
// Call OnPropertyChanged whenever the property is updated
NotifyPropertyChanged("Expanded");
}
}
}
public class FamilyMember : baseVM
{
public string Name { get; set; }
public int Age { get; set; }
private bool _isExpanded;
public bool Expanded
{
get { return _isExpanded; }
set
{
throw new Exception("Set to: " + value);
_isExpanded = value;
// Call OnPropertyChanged whenever the property is updated
NotifyPropertyChanged("Expanded");
}
}
}
public class baseVM
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}