2013-05-21 6 views
0

У меня есть класс, полученный из INotifyPropertyChanged, для отслеживания изменений свойств. Эти свойства привязаны к TreeView и необходимы для выполнения поиска в TreeViewItems. Когда в настройках свойств this.OnPropertyChanged("IsExpanded") вызывается по какой-то причине this.PropertyChanged == null, когда «IsExpanded» барботируется в корневой элемент TreeView. Почему это null здесь, а не null для более глубоких элементов TreeView? Что я могу решить эту проблему? Мой код CS:Когда PropertyChanged вызвал событие 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, все начало работать.

Смежные вопросы