2012-01-31 25 views
0

我有一個小小的WPF應用程序,它有一個TreeView來顯示分層數據。我創建了一個ViewModel來表示要顯示的數據。實際上有幾個具體的ViewModel,因爲我在不同級別的層次上有不同類型的對象。TreeView和設置IsSelected =選擇了錯誤的項目

public abstract class TreeViewModelBase 
{ 
    private bool _isSelected; 
    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set 
     { 
      if (value == _isSelected) return; 

      _isSelected = value; 
      OnItemSelected(this, new TreeViewModelSelectedEventArgs(this)); 
      RaisePropertyChanged(() => IsSelected); 
     } 
    } 
} 

所以,爲了一個新的節點添加到三個我剛加入新視圖模型對象,並讓數據綁定做它的魔力,以更新樹。我也想讓最近添加的節點成爲所選節點,所以我將IsSelected屬性設置爲true。

public class FooTreeViewModel : TreeViewModelBase 
{ 
    public ObservableCollection<BarTreeViewModel> Bars { get; private set; } 
    public void AddNewPage(Bar newBar) 
    { 
     var newBarTreeViewModel = new BarTreeViewModel(newBar); 
     Bars.Add(newBarTreeViewModel); 
     newBarTreeViewModel.IsSelected = true; 
    } 
} 

但是,這是我似乎有一些麻煩。我注意到IsSelected用於我最近添加的對象正在執行,但僅僅一秒之後IsSelected用於前一個項目正在執行。這對我來說似乎很奇怪。

儘管樹已正確更新,但樹的SelectedItem仍然指向前一個節點,而不是最近添加的標有IsSelected的節點。

任何提示我可能會丟失什麼?

+0

OK;有時候只需要與某人討論這個問題。我寫這篇文章後,我想:IsSelected屬性被調用兩次,第一次爲最近添加的節點的IsSelected = true和先前選擇的節點上的IsSelected = false。因爲我總是引發OnSelectedItem事件(這會導致ViewModel找出當前選定的節點),所以最後一次呼叫獲勝 - 這是前一個節點。因此,通過將代碼更改爲僅在_isSelected爲true時調用OnSelectedItem,才能修復我的代碼。 – nyn3x 2012-01-31 09:43:57

回答

0

OK;有時候只需要與某人討論這個問題。我寫這篇文章後,我想:IsSelected屬性被調用兩次,第一次爲IsSelected=true爲最近添加的節點和IsSelected = false在先前選擇的節點。因爲我總是提高OnSelectedItem事件(這會導致ViewModel找出當前選定的節點),最後一次呼叫獲勝 - 這是前一個節點。所以通過更改代碼只在_isSelected爲真時調用OnSelectedItem,這固定了我的代碼。