2013-04-12 5 views
2

Есть ли способ в XAML вызывать функцию при изменении свойства TreeViewItem IsExpanded?wpf TreeView - Как вызвать функцию при изменении свойства IsExpanded

Я считаю, что не очень хорошей альтернативой было бы перебрать все элементы TreeViewItems и сделать item.IsExpanded + = вызов обработчика, если я правильно понял вещи.

Или я мог проверить наличие кликов на элементе расширения, я думаю.

Что я делаю, это сохранение состояния разворачивания/срыва дерева. Пожалуйста, ответьте на первый вопрос, прежде чем предлагать альтернативные способы сохранить это только для того, чтобы направить меня на свойства и xaml.

ответ

1

Я хотел бы связать свойство IsExpanded в TreeViewItem моей модели, используя что-то вроде:

    <TreeView.ItemContainerStyle> 
         <Style TargetType="TreeViewItem"> 
          <Setter Property="IsSelected" Value="{Binding IsSelected}" /> 
          <Setter Property="IsExpanded" Value="{Binding IsExpanded}" /> 
         </Style> 
        </TreeView.ItemContainerStyle> 

Затем можно запустить через модель и получить значение для IsExpanded и сохранить его. Кроме того, при восстановлении просто установите свойство IsExpanded.

Поскольку вам нужно вызвать другой код при изменении, осуществлять IsExpanded так:

private bool _IsExpanded; 
public bool IsExpanded 
{ 
    get { return _IsExpanded; } 
    set 
    { 
     if (_IsExpanded == value) return; 
     _IsExpanded = value; 
     NotifyPropertyChanged("IsExpanded");//or however you need to do it 
     CallSomeOtherFunc();//this is the code that you need to be called when changed. 
    } 
} 
+0

Это не сработает для меня, поскольку мне нужно выполнить код, когда изменение происходит. Однако да, это хорошее решение. – Mark

+1

Затем просто введите код в ViewModel для набора IsExpanded. public bool IsExpanded {get {return _IsExpanded; } set {_IsExpanded = значение; CallSomeOtherFunc(); }} Конечно, я пропустил код для INotifyPropertyChanged. –

+0

Именно так я и сделал бы это. Нет необходимости в коде. Если вы используете что-то вроде caliburn.micro, все будет намного проще. –

1

Опираясь на ответ Иоиля, вы можете использовать EventSetter сек в TreeViewItem Style, которые относятся к обработчиков событий в коде, за :

<TreeView ... > 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="TreeViewItem" > 
      <EventSetter Event="TreeViewItem.Expanded" Handler="OnTreeExpanded" /> 
      <EventSetter Event="TreeViewItem.Collapsed" Handler="OnTreeCollapsed" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
    ... 

код-сзади - нормальные обработчики событий:

private void OnTreeExpanded(object sender, RoutedEventArgs e) 
{ 
    var tvi = (TreeViewItem)sender; 
    ... 
    e.Handled = true; 
} 
private void OnTreeCollapsed(object sender, RoutedEventArgs e) 
{ 
    var tvi = (TreeViewItem)sender; 
    ... 
    e.Handled = true; 
} 

Примечание: убедитесь, что вы установите e.Handled = true в обработчиках событий, иначе вы также получите события от всех родителей текущего TreeViewItem.

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