2013-05-21 29 views
0

我有一个派生自INotifyPropertyChanged的类来跟踪属性更改。此属性绑定到TreeView,并需要在TreeViewItems中执行搜索。当属性设置器this.OnPropertyChanged("IsExpanded")由于某种原因被调用时this.PropertyChanged == null当“IsExpanded”冒泡到TreeView的根元素。为什么它在这里是空的而且在更深的TreeView元素上不为null?我可以解决这个问题? 我的代码CS:当PropertyChanged调用event PropertyChanged = null

public class TreeViewItemViewModel:INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

    .................... 

     bool _isExpanded; 
     public bool IsExpanded 
     { 
      get { return _isExpanded; } 
      set 
      { 
       if (value != _isExpanded) 
       { 
        _isExpanded = value; 
        this.OnPropertyChanged("IsExpanded"); 
       } 

       //Expand all till the root 
       if (_isExpanded && _parent != null) 
        _parent._isExpanded = true; 

       //Lazy load children, if nessesary 
       if (this.HasDummyChild) 
       { 
        this.Children.Remove(DummyChild); 
        this.LoadChildren(); 
       } 
      } 

     } 

     bool _isSelected; 
     public bool IsSelected 
     { 
      get { return _isSelected; } 
      set 
      { 
       if (value != _isSelected) 
       { 
        _isSelected = value; 
        this.OnPropertyChanged("IsSelected"); 
       } 
      } 
     } 
    ............................. 
    } 

我的XAML代码:

  <TreeView ItemsSource="{Binding Areas}"> 
       <TreeView.ItemContainerStyle> 
        <Style TargetType="{x:Type TreeViewItem}"> 
         <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
         <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
         <Setter Property="FontWeight" Value="Normal" /> 
         <Style.Triggers> 
          <Trigger Property="IsSelected" Value="True"> 
           <Setter Property="FontWeight" Value="Bold" /> 
          </Trigger> 
         </Style.Triggers> 
        </Style> 
       </TreeView.ItemContainerStyle> 
       <TreeView.Resources> 
        <HierarchicalDataTemplate 
         DataType="{x:Type vAreas:AreaViewModel}" 
         ItemsSource="{Binding Children}" 
         > 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding Name}" /> 
         </StackPanel> 
        </HierarchicalDataTemplate> 
       </TreeView.Resources> 
      </TreeView> 

回答

0

的问题是,我从来没有认购我的事件的PropertyChanged。 只要我认购它,它开始正常工作

this.PropertyChanged += AreaViewModel_PropertyChanged; 

void AreaViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "IsExpanded") 
     { 
      //Expand all till the root 
      if (this.IsExpanded && this.Parent != null) 
       this.Parent.IsExpanded = true; 

      //Lazy load children, if nessesary 
      if (this.HasDummyChild) 
      { 
       this.Children.Remove(DummyChild); 
       this.LoadChildren(); 
      } 
     } 
    } 
0

我这一个了一段挣扎。最后事实证明,我提供树视图的集合是一个ObservableCollection属性,但实际上是一个列表。

只要我把它变成一个ObservableCollection,一切都开始工作。