2015-07-10 2 views
3

Я создал древовидную структуру, и теперь я хочу получить имя заголовка в виде строки для использования в 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> 
       .... 

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); 
    } 
} 
+0

Вы пробовали 'CommandParameter =" {Binding SelectedItem.Header, ElementName = EquipmentTreeView} "'? –

+0

Фактически параметр (SelectedItem) в relayCommand выдает мне ошибку, которая не существует в текущем контексте – Phil

+0

Забудьте о SelectedItem, вы должны передать параметр RelayCommand. Изменение, которое предлагает @Mike, не обязательно. – GreenEyedAndy

ответ

2

Я не знаю, осуществление вашей 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); 
} 

все зависит от того, что ваш RelayCo mmand может обрабатывать CommandParameter.

+0

Я бы изменил этот код, поэтому команда получает строку заголовка напрямую, вместо того, чтобы обрабатывать TreeViewItem в ViewModel. OP просто должен будет изменить привязку CommandParameter на 'SelectedItem.Header', чтобы это работало. – almulo

+0

Я просто слепая копия приклеила ваше предложение, и это порождает ошибку: делегат system.action не принимает 1 аргумент. Я очень зелёный в работе с C#. Любые предложения о том, как это исправить? – Phil

+0

Это зависит от вашей реализации RelayCommand. Попробуйте этот [ссылка] (https://gist.github.com/schuster-rainer/2648922) – GreenEyedAndy

Смежные вопросы