2013-04-12 1 views
2

TreeViewItem 속성 IsExpanded가 변경 될 때 XAML에서 함수를 호출하는 방법이 있습니까?wpf TreeView - IsExpanded 속성 변경시 함수 호출 방법

나는 그다지 좋지 않은 대안이 모든 TreeViewItems를 반복하고 항목을 올바르게 이해할 경우 item.IsExpanded + = handler 호출을한다고 생각합니다.

아니면 확장기 요소의 클릭 수를 확인할 수 있습니다.

내가하고있는 일은 나무의 확장/축소 상태를 유지하는 것입니다. 첫 번째 질문에 답하기 전에 속성 및 xaml에 대한 나를 정화시키기 위해이를 유지할 수있는 대안을 제안하십시오.

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

가 그럼 난 모델을 통해 실행할 수 있으며으로 IsExpanded 값을 얻을하고 저장 :

답변

1

내가 좋아하는 뭔가를 사용하여 내 모델에 TreeViewItem의으로 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

그런 다음 IsExpanded 집합에 대한 ViewModel에 코드를 넣으면됩니다. public bool IsExpanded {get {return _IsExpanded; } set {_IsExpanded = value; CallSomeOtherFunc(); }} 물론 INotifyPropertyChanged에 대한 코드는 생략했다. –

+0

이것은 정확히 내가하는 방법이다. 코드가 필요 없습니다. caliburn.micro와 같은 것을 사용하면 모든 것이 훨씬 쉬울 것입니다. –

1

조엘의 대답에 건물, 당신은 당신의 이벤트 핸들러에 코드 숨김을 참조하는 TreeViewItem StyleEventSetter의를 사용할 수 있습니다 :

<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의 모든 부모로부터 이벤트를받습니다.