2011-02-25 3 views
2

내 MVVM 응용 프로그램에서 treeviewitem을 선택보기로 가져와야하는 treeview가 있습니다. treeview는 데이터베이스의 레코드를 나타냅니다. 각 트리보기 항목은 선택 될 때 항목을 확장하여 요청시 해당 하위 항목을로드합니다.wpf TreeViewItem BringIntoView가 항상 작동하지 않습니다.

트 리뷰 스타일은 다음과 같이 정의된다 :

<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <Setter Property="OverridesDefaultStyle" Value="True"/> 
     ... 
     <EventSetter Event="Selected" Handler="OnTreeViewItemSelected"/> 

핸들러는 다음과 같이 정의된다 :

private void OnTreeViewItemSelected(object sender, RoutedEventArgs e) 
{ 
    if (!Object.ReferenceEquals(sender, e.OriginalSource)) 
    { 
    return; 
    } 
    TreeViewItem item = e.OriginalSource as TreeViewItem; 
    if (item != null) 
    {   
    EventHandler eventHandler = null; 
    eventHandler = new EventHandler(delegate 
    { 
     treeData.LayoutUpdated -= eventHandler; 
     item.BringIntoView(); 
    }); 
    treeData.LayoutUpdated += eventHandler; 
    } 
} 

이 이미로드 된 항목에 대해 완벽하게 잘 작동합니다.

[편집 : 사실 선택한 항목의 부모가 아니라 단지로드보다 확대되어야한다]를 모색 항목이 발견 될 때까지로드하는 경우, treeviewitems이 반복된다

이 발견 된 항목을 선택하고, 위의 처리기가 성공적으로이를보기에 가져옵니다.

문제가 이미로드되지 않은 항목입니다. 이 경우 내 코드는 찾은 항목의 조상 레코드를 가져 와서 항목을 확장하면서 검색된 항목에 도달 할 때까지 항목을 확장 (따라서 하위 항목로드)합니다. 이것은 성공적으로 선택되었지만 볼 수는 없습니다.

누구든지 해결 방법을 알고 있습니까? TreeViewItemViewModel에서

[UPDATE] :

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

     if (value == true)   
     IsExpanded = value;   

     this.OnPropertyChanged("IsSelected"); 
    } 
    } 
} 

public bool IsExpanded 
{ 
    get { return _isExpanded; } 
    set 
    { 
    if (_isExpanded == value) 
     return; 

    _isExpanded = value; 
    this.OnPropertyChanged("IsExpanded"); 

    if (_isExpanded && 
     _parent != null && 
     _parent.IsExpanded == false) 
     _parent.IsExpanded = true; 

    LoadChildren(); 
    } 
} 

LoadChildren() 메소드는 아이들 플래그를 사용하여 로딩 필요한지 여부 다룬다.

ItemContainerStyle

setter 속성 = "으로 IsExpanded"값 = setter 속성 = "에 isSelected"값 = "{으로 IsExpanded, 모드 = 양방향 바인딩}" "{에 isSelected 바인딩, 모드 = 양방향}"

+0

itemcontainerstyle의 IsSelected 및 IsExpanded 속성에 관한 코드를 게시하십시오.또한 isslected와 isexpanded에 대한 CS 측의 코드와 subtree 항목을로드하고로드되었음을 나타내는 코드도 있습니다. –

답변

0

좋아, 그래서 나는 이것을 '사고'로 해결 한 것 같다. 나는 백그라운드 프로세스 선택한에서 검색을 실행하면 단순히 부울 run_success = _searchlogic.PerformSearch (_searchterm)를 실행하는 경우

그것은,

public void Search() 
{ 
    ImplementSearch(); 

    _workinghelper = new WorkingHelper(); 
    SearchWorkingViewModel searchvm = new SearchWorkingViewModel(_workinghelper.WorkingWindow); 
    VisualUtils.FadeTreeViewItemViewModel(1.0, 0.2, 0, 100); 
    _workinghelper.MakeWorking(searchvm); 

    VisualUtils.FadeTreeViewItemViewModel(0.2, 1.0, 0, 001); 
} 

public bool CanSearch 
{ 
    get { return _searchlogic.SearchTypeIsValid(_searchterm); } 
} 

void ImplementSearch() 
{  
    BackgroundTaskManager.RunBackgroundTask(
    () => 
    { 
     bool run_success = _searchlogic.PerformSearch(_searchterm); 
     Thread.Sleep(500); 
     return run_success; 
    }, 
    (run_success) => 
    { 
     if (run_success == false) 
     ApplicationSetup.DisableApp((MainWindow)App.Current.MainWindow, "The search function has caused an unexpected internal error. Please contact an administrator for help."); 

     if (_workinghelper != null) 
     _workinghelper.DisposeWorkingWindow(); 
    });  
} 

그러나보기로된다; ImplementSearch()에서 항목을 볼 수 없습니다.

3

this가 문제

를 해결하고

편집 TreeView를위한 MVVM을 사용하는 방법에 대한 this 기사에 구축 될 수 있습니다 도있다 treeviewitemcontainers가 아직 생성되지 않은 가능성. 그럼 당신은 TreeViews와 바이올린을해야한다 ItemContainerGenerator

+0

예, 이미 TreeView 용 MVVM을 구현했으며 TreeViewItemBehaviour 연결된 속성을 사용했지만 여전히 문제가 남아 있습니다. ItemContainerGenerator를 확인해 보겠습니다. – pilsdumps

+0

저는 아직도이 문제로 고민 중입니다. 나는 https://gist.github.com/755546#file_tree_view_item_finder.cs와 같은 몇 가지 다른 해결책을 시도했지만 문제는 여전히 남아있다. 편집을 주목하십시오. 사실 부모가로드 된 다음 접히면 항목이 선택되지만 표시되지는 않습니다. – pilsdumps

관련 문제