2010-10-31 117 views
1

我有一個WPF TreeView顯示我的ViewModel。我有一個按鈕,它將一個項目添加到底層ViewModel中的一個集合中,該集合將一個子節點添加到樹中。這部分工作。WPF樹視圖添加到樹時選擇項目

我想要的是新添加的項目是樹視圖的SelectedItem。

我已經閱讀過這個:How to programmatically select an item in a WPF TreeView?但它不工作,因爲我添加到樹中的項不是TreeViewItems,它們是我的模型中的類。

我也讀過這個:Simplifying the WPF TreeView by Using the ViewModel Pattern但是我不想爲我添加到TreeView的每個項目創建一個ViewModel。我覺得它會產生不必要的冗餘對象。即我有我的ViewModel與IsSelected屬性包裝我的模型沒有IsSelected屬性。這導致在我的實際ViewModel工作過多。

有無論如何告訴TreeView選擇新添加的項目嗎?以編程方式或通過XAML。

謝謝。

回答

1

我不認爲有任何直接的方法來選擇一個新添加的項目到TreeView,因爲TreeView本身並不知道這個改變。 TreeViewItem是在擴展時生成的,每個TreeViewItem本身都是一個ItemsControl,用於管理他們自己的子容器。
也許有可能在加載時展開整個TreeView併爲每個容器獲取ObservableCollection,然後監聽CollectionChanged事件,但由於View並不知道集合的類型,因此IList可能是最好的可以做,我們沒有CollectionChanged事件,所以我沒有看到它。但也許我失去了一些東西..

無論如何,我會用這種方法(我已經看到你已經看過),因爲它可能會給你最小的麻煩,但如果你想出一個更好的解決方案比我很高興知道這是什麼:-)

<TreeView ...> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+0

我要結束了與一個ViewModel樹的每個子節點。但爲了節省自己一些痛苦,這些ViewModel將擴展我的實際模型並實現一個包含我需要的IsSelected屬性的ITreeViewModel接口。我真的不喜歡這個解決方案,但現在我認爲它工作。 – Adam 2010-10-31 23:11:50

+0

好吧,聽起來不錯。祝你好運 – 2010-10-31 23:19:18