2011-08-18 64 views
0

我使用分層DAtaTemplate屬性在WPF MVVM中創建了一個樹視圖。如何將TreeView的SelectedItem傳遞給另一個命令?

在Treeview之外,我有一個「編輯」按鈕。在按下編輯按鈕時,我想將TreeView的selectedItem傳遞給viewmodel中的RelayCommand。

我在TreeviewItem中雙擊節點實現相同的功能。不過,我想知道在外面完成這件事的最佳方法是什麼。

我的代碼結構如下

的MainView - > MainViewModel

StateViewItem - > StateViewModel(HierarchicalDataTemplate從TreeViewItemViewModel繼承)

RegionViewItem - > RegionViewModel(DataTemplate中從TreeViewItemViewModel繼承)

RegionViewModel處理節點的雙擊並完成編輯功能。

然而,「編輯」按鈕是在樹形視圖之外,我如何將選定的RegionViewItem傳遞給命令綁定,以便我可以加載它進行編輯?

預先感謝幫助

回答

1

是否RegionViewModel有機會獲得StateViewModel?或者更重要的是,StateViewModel.SelectedItem? (某些代碼將是有益的)

如果沒有,你可能要實現事件系統中,每當StateViewModel.SelectedItem變化,它廣播StateChanged事件,RegionViewModel訂閱了該事件並跟蹤SelectedState

+0

感謝您的回答! RegionViewModel有一個父屬性,可以訪問StateViewModel。 StateViewModel有一個Children屬性,它是RegionViewModel的集合。我不允許發佈項目代碼,但如果你需要我會創建一個repro併發布它 – ganeshran

+0

我認爲我錯讀了你的問題......你有兩種編輯方法,一種是在RegionViewModel中,它可以在雙擊上工作,一個在MainViewModel(?)中應該在Button Click上工作? – Rachel

+0

我在RegionViewModel中有一個編輯方法,它將消息傳遞到另一個視圖模型以加載要編輯的區域。 在MainViewModel中,我想要訪問在Treeview中選擇的RegionViewModel對象,這樣我就可以傳遞消息來加載區域進行編輯 – ganeshran

1

代碼以下僅用於MVVM的引導目的。它可能會/可能不會編譯。

方法1:

假設你TreeViewItemViewModel是樹中的所有樹視圖項的基本項目的水平視圖模型數據上下文,加入TreeViewItemViewModel可寫屬性調用IsSelected。不要忘記通知IsSelected的安裝人員。

在您的XAML樹視圖中添加的Style以下針對性的TreeViewItem ....

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

當任何TreeView中被選中這樣一來,只有自己的TreeViewItemViewModelIsSelected屬性將是真實的,並休息所有樹視圖項目將是錯誤的。因此,剩下的任務是從與TreeViewItemsSource綁定的對象的層次結構中找到所選的TreeViewItemViewModel對象。

方式2:

有一個TreeViewItem附加屬性和處理其MouseDown事件。檢查TreeViewItem的「IsSelected」值是否爲真,並提取其數據上下文,該數據上下文將是選定的TreeViewItemViewModel

<TreeView.Resources> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="local:MyAttachedBehavior.HandleMouseDown" Value="true" /> 
     </Style> 
    </TreeView.Resources> 
靜態HandleMouseDownPropertyChanged()依賴屬性改變的方法

,關於辦理(TreeViewItem)sender MouseDown事件......

((TreeViewItem)sender).MouseDown += TreeViewMouseDownEventHandler; 

    private static TreeViewMouseDownEventHandler(object sender, MouseButtonEventArgs e) 
    { 
     var treeViewItem = (TreeViewItem)sender; 
     if (treeViewItem.IsSelected) 
     { 
      var mySelectedItem = treeViewItem.DataContext as TreeViewItemViewModel; 
     } 
    } 

通過這個選擇`TreeViewItemViewModel」實例爲需要選擇的項目到你的日常。

讓我知道這是否有幫助。

+0

謝謝我現在正在嘗試Way1。會讓你知道它是否有效 – ganeshran

相關問題