双向绑定的问题treeviewitem.is扩展了分层数据模板

时间:2018-03-23 10:58:28

标签: c# wpf data-binding treeview

我尝试将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中设置,你知道为什么吗?

提前致谢!

1 个答案:

答案 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));
        }
    }
}