2013-07-02 51 views
2

我有一個ContextMenu的TreeView,其中包含添加/刪除節點的選項。當我向樹添加一個節點時,我正在向我的視圖模型發送一個命令,該模型通過爲顯示樹和一個後備數據對象添加一個包裝器來處理添加請求。當我這樣做時,我希望顯示樹中新創建的包裝器成爲樹視圖的選定項目。我怎樣才能做到這一點?我不知道如何從視圖模型訪問樹視圖,並懷疑你甚至可能不應該。謝謝。從ViewModel訪問TreeView

+0

如何將節點添加到樹中?從視圖還是從ViewModel? –

+0

我從ViewModel中執行它。該視圖將命令參數傳遞給中繼命令,該中繼命令處理節點的創建和刪除。 – TSM

回答

0

如果我理解你,你需要綁定到你的SelectedItem。 所以在您的視圖模型創建:

private your_object_name _selectedItem; 
public your_object_name SelectedItem 
{ 
    get { return _selectedItem; } 
    set 
    { 
     _selectedItem = value; 
     RaisePropertyChanged("SelectedItem"); 
    } 
} 

,並在TreeView控件的XAML代碼:

<TreeView SelectedItem="{Binding SelectedItem, Mode=TwoWay}" .../> 

Mode=TwoWay允許您更改使用SelectedItem屬性從您的ViewModel TreeView控件選擇。

此致敬禮。

+0

它看起來好像SelectedItem是TreeViews上的只讀屬性,並且我將不得不製作一個自定義TreeView控件來執行此操作。 – TSM

1

在您的視圖模型的樹型視圖,你有一個 「IsSelected」 屬性,如:

/// <summary> 
/// Base class for all ViewModel classes displayed by TreeViewItems. 
/// This acts as an adapter between a raw data object and a TreeViewItem. 
/// </summary> 
public class TreeViewItemViewModel : CoreViewModel 
{ 
    #region Data 

    private readonly ObservableCollection<TreeViewItemViewModel> _children; 
    private readonly TreeViewItemViewModel _parent; 

    private bool _isExpanded = false; 
    private bool _isSelected; 

    #endregion // Data 

    #region Constructors 
    #endregion // Constructors 

    #region Children 

    /// <summary> 
    /// Returns the logical child items of this object. 
    /// </summary> 
    public ObservableCollection<TreeViewItemViewModel> Children 
    { 
     get { return _children; } 
    } 

    #endregion // Children 

    #region HasLoadedChildren 
    #endregion // HasLoadedChildren 

    #region IsExpanded 

    /// <summary> 
    /// Gets/sets whether the TreeViewItem 
    /// associated with this object is expanded. 
    /// </summary> 
    public bool IsExpanded 
    { 
     get { return _isExpanded; } 
     set 
     { 
      if (value != _isExpanded) 
      { 
       _isExpanded = value; 
       OnPropertyChanged("IsExpanded"); 
      } 

      // Expand all the way up to the root. 
      if (_isExpanded && _parent != null) 
       _parent.IsExpanded = true; 

      // Lazy load the child items, if necessary. 
      if (this.HasDummyChild) 
      { 
       this.Children.Remove(DummyChild); 
       this.LoadChildren(); 
      } 

     } 
    } 

    #endregion // IsExpanded 

    #region IsSelected 

    /// <summary> 
    /// Gets/sets whether the TreeViewItem 
    /// associated with this object is selected. 
    /// </summary> 
    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set 
     { 
      if (value != _isSelected) 
      { 
       _isSelected = value; 
       OnPropertyChanged("IsSelected"); 
      } 
     } 
    } 

    #endregion // IsSelected 

然後在您的XAML,你需要建立一個風格樹型視圖:

<TreeView.Resources> 
       <Style x:Key="TreeViewItemStyle" TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
        <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /> 
       </Style> 
</TreeView.Resources> 

現在你可以通過在新添加的項目中將IsSelected屬性設置爲True來設置TreeView的SelectedItem。