получение имени заголовка в treeviewItems

Я создал древовидную структуру и теперь хочу получить имя заголовка в виде строки для использования в ViewModel. Команда работает, но я не могу передать имя заголовка в качестве параметра метода.

Как мне получать имя заголовка каждый раз, когда я выбираю новый новый 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);
    }
}

person Phil    schedule 10.07.2015    source источник
comment
Вы пробовали CommandParameter="{Binding SelectedItem.Header, ElementName=EquipmentTreeView}"?   -  person Mike Eason    schedule 10.07.2015
comment
На самом деле параметр (SelectedItem) в relayCommand выдает мне ошибку не существует в текущем контексте   -  person Phil    schedule 10.07.2015
comment
Забудьте SelectedItem, вы должны передать параметр RelayCommand. Изменение, которое предлагает @Mike, не является необходимым.   -  person GreenEyedAndy    schedule 10.07.2015
comment
@GreenEyedAndy Предложение Майка хорошее в сочетании с вашим ответом. Таким образом, вам не нужно обрабатывать TreeViewItem в ViewModel (элементы управления на самом деле не принадлежат ViewModel)   -  person almulo    schedule 10.07.2015
comment
@almulo, вы абсолютно правы - я изменю свой ответ.   -  person GreenEyedAndy    schedule 10.07.2015


Ответы (1)


Я не знаю реализацию вашего RelayCommand, но вы должны передать параметр commandParameter RelayCommand в качестве параметра вашего метода GetItemHeader. Вы передаете SelectedItem, который не определен. Без каких-либо изменений в вашем xaml сделайте следующее:

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

Но тогда я бы переименовал метод, потому что он не делает того, что ожидалось. Это не дает вам ItemHeader! Вы извлекаете заголовок и передаете его методу, метод отображает 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.

person GreenEyedAndy    schedule 10.07.2015
comment
Я бы изменил этот код, чтобы команда напрямую получала строку заголовка, вместо того, чтобы обрабатывать TreeViewItem в ViewModel. OP просто должен изменить свою привязку CommandParameter на SelectedItem.Header, чтобы это сработало. - person almulo; 10.07.2015
comment
Я просто слепо скопировал ваше предложение, и оно выдает мне ошибку, говорящую о том, что Delegate system.action не принимает 1 аргумент. Я очень зеленый в работе с С#. Любые предложения о том, как это исправить? - person Phil; 10.07.2015
comment
Это зависит от вашей реализации RelayCommand. Попробуйте эту ссылку - person GreenEyedAndy; 10.07.2015
comment
@Phil, у тебя есть проблемы с этим? Опубликуйте свою реализацию RelayCommand, мы можем проверить, что не так. В противном случае было бы неплохо, если бы вы отметили ответ. - person GreenEyedAndy; 10.07.2015