我已经创建了一个树 View ,现在我想获取标题名称作为要在ViewModel中使用的字符串。该命令有效,但是我无法获取要在方法中作为参数传递的 header 名称。

每次选择新的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>
               ....

ViewModel(该参数无效)
 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);
    }
}

最佳答案

我不知道您的RelayCommand的实现,但是您必须将RelayCommand的commandParameter传递为GetItemHeader-Method的参数。您正在传递未定义的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}"/>

并在ViewModel中:
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);
}

全部基于您的RelayCommand可以处理CommandParameter的事实。

09-30 17:24