2015-07-10 45 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