2016-06-09 2 views
0

나는이 TreeView 컨트롤이초점 TreeViewItem

public class ModelView 
{ 
    public TreeViewModelView TvMview { get; set; } = new TreeViewModelView(); 
} 

public class TreeViewModelView 
{ 
    public ObservableCollection<FirstNode> FirstNodes { get; set; } = new ObservableCollection<FirstNode>(); 
} 

public class FirstNode : TreeItem 
{ 
    public ObservableCollection<SecondNode> SecondNodes { get; set; } = new ObservableCollection<SecondNode>(); 
    public string HeaderText { get; set; } 
} 

public class SecondNode : TreeItem 
{ 
    public ObservableCollection<ThirdNode> ThirdNodes { get; set; } = new ObservableCollection<ThirdNode>(); 
    public string HeaderText { get; set; } 
} 

public class ThirdNode 
{ 
    public string HeaderText { get; set; } 
} 

public class TreeItem 
{ 
    public bool IsExpanded { get; set; } 
    public bool IsSelected { get; set; } 
} 

을 그리고 예상대로 모든 노력하고 있습니다. 하지만 ... 나는 seach를 구현하고 싶다 :

foreach (var firstNode in Mview.TvMview.FirstNodes) 
     { 
      if (firstNode.HeaderText.Contains(textBox.Text)) 
      { 
       firstNode.IsExpanded = true; 
       firstNode.IsSelected = true; 
       TreeViewItem tvItem = (TreeViewItem)treeView.ItemContainerGenerator.ContainerFromItem(firstNode); 
       tvItem?.Focus(); 
       return; 
      } 
     } 

올바른 노드가 확장되었지만 tvItem은 항상 null이다. 나는 언젠가 ContainerFromItem이 가상화를 좋아하지 않는다고 언젠가 읽었다. ...

어떤 생각?

감사합니다.

+0

ContainerFromItem이 작동하지 않습니다. TreeView에 VirtualizingPanel.IsVirtualizing = "False"를 추가하십시오. 귀하의 뷰 모델이 맞습니까? INotifyPropertyChanged를 구현 했습니까? – user2880486

+0

INotifyPropertyChanged는 TreeItem 기본 클래스에서 구현됩니다. 그리고 확실히 ... 가상화를 제거하면 문제가 해결되지만, 요점은 ... 예를 들어 virutalization없이 TreeView에 30,000 개의 항목을 추가하면 180 초가 걸립니다. 가상화 : 1 초. –

답변

0

마지막으로 나는 TreeItem 기본 클래스에서 Focus() 메서드를 구현하여이 문제를 해결했습니다.

public class TreeItem : INotifyPropertyChanged 
{ 
    private bool _IsExpanded; 
    public bool IsExpanded 
    { 
     get { return _IsExpanded; } 
     set { _IsExpanded = value; OnPropertyChanged("IsExpanded"); } 
    } 

    private bool _IsSelected; 
    public bool IsSelected 
    { 
     get { return _IsSelected; } 
     set { _IsSelected = value; OnPropertyChanged("IsSelected"); } 
    }   

    public void Focus(TreeView tView) 
    { 
     TreeViewItem tvItem = (TreeViewItem)tView.ItemContainerGenerator.ContainerFromItem(this); 
     tvItem?.Focus(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 
} 

을 그리고 당신은 다음과 같이 호출 할 수 있습니다 : 그래서, 기본 클래스는 다음과 같이 항목이 생성 될 때까지

if (firstNode.HeaderText.Contains(textBox.Text)) 
{ 
    firstNode.IsExpanded = true; 
    firstNode.IsSelected = true; 
    firstMatch.Focus(); 
}