2015-07-10 86 views
3

我創建了一個treeview,現在我想將標題的名稱作爲一個字符串在ViewModel中使用。該命令的工作原理,但我無法獲得頭的名稱作爲方法中的參數傳遞。在treeviewItems中獲取標題的名稱

每次我選擇新的新treeViewItem時,如何獲取標題的名稱?

XAML

<TreeView Name="EquipmentTreeView"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectedItemChanged"> 
       <i:InvokeCommandAction 
        Command="{Binding SelectItemCommand}" 
        CommandParameter="{Binding SelectedItem, ElementName=EquipmentTreeView}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
     <TreeViewItem Header="Camera"> 
      <TreeViewItem Header="Digital Camera">     
      </TreeViewItem > 
      <TreeViewItem Header="Film Camera"> 
       <TreeViewItem Header="35mm Film Sound Camera"></TreeViewItem> 
       <TreeViewItem Header="35mm Film MOS Camera"></TreeViewItem> 
       <TreeViewItem Header="Film Magazines"></TreeViewItem> 
      </TreeViewItem> 
       .... 

視圖模型(參數不工作)

public class EquipmentManagerViewModel : NotifyUIBase 
{ 

    public EquipmentManagerViewModel() 
    { 
     SelectItemCommand = new RelayCommand(() => GetItemHeader(SelectedItem)); 
    } 

    public RelayCommand SelectItemCommand { get; private set; } 
    private void GetItemHeader(string selectedHeader) 
    { 
     MessageBox.Show(selectedHeader); 
    } 
} 
+0

你試過CommandParameter = {{Binding SelectedItem.Header,ElementName = EquipmentTreeView}「'? –

+0

實際上relayCommand中的(SelectedItem)參數會引發我在當前上下文中不存在的錯誤 – Phil

+0

忘記SelectedItem,您必須傳遞您的參數RelayCommand。 @Mike提出的改變是沒有必要的。 – GreenEyedAndy

回答

2

我不知道你的RelayCommand的實現,但是你必須通過RelayCommand作爲參數的commandParameter你的GetItemHeader方法。您正在傳遞未定義的SelectedItem。 如果沒有你的任何變化XAML做到以下幾點:

public EquipmentManagerViewModel() 
{ 
    SelectItemCommand = new RelayCommand(tvi => GetItemHeader(((TreeViewItem)tvi).Header.ToString())); 
} 

但後來因爲它不會做什麼期望我會重新命名方法。它不會給你ItemHeader!您提取標題並將其提供給Methode,方法顯示帶有文本作爲參數的MessageBox。

編輯

@almulo的評論使我以下變化:

在XAML爲@Mike提出:

<i:InvokeCommandAction 
    Command="{Binding SelectItemCommand}" 
    CommandParameter="{Binding SelectedItem.Header, ElementName=EquipmentTreeView}"/> 

,並在視圖模型:

public EquipmentManagerViewModel() 
{ 
    SelectItemCommand = new RelayCommand<String>(obj => GetItemHeader(obj.ToString())); 
} 
public RelayCommand<String> SelectItemCommand { get; private set; } 
private void GetItemHeader(string selectedHeader) 
{ 
    MessageBox.Show(selectedHeader); 
} 

全部基於您的RelayCo命令可以處理CommandParameter。

+0

我會修改此代碼,以便Command直接接收標題字符串,而不必處理ViewModel中的TreeViewItem。 OP將只需將其CommandParameter綁定改爲「SelectedItem.Header」即可工作。 – almulo

+0

我只是盲目複製粘貼你的建議,它會拋出一個錯誤,說Delegate system.action不需要1個參數。我在使用C#時非常綠色。有關如何解決這個問題的任何建議? – Phil

+0

這取決於你的RelayCommand的實現。嘗試這一個[鏈接](https://gist.github.com/schuster-rainer/2648922) – GreenEyedAndy