在 treeviewItems 中获取 header 的名称
getting the name of header in treeviewItems
我创建了一个树视图,现在我想获取 header 的名称作为要在 ViewModel 中使用的字符串。该命令有效,但我无法获取 header 的名称作为方法中的参数传递。
每次 select 一个新的新 treeViewItem 时如何获取 header 的名称?
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!您提取 Header 并将其提供给 Methode,Method 正在显示一个带有文本作为参数的 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 的事实。
我创建了一个树视图,现在我想获取 header 的名称作为要在 ViewModel 中使用的字符串。该命令有效,但我无法获取 header 的名称作为方法中的参数传递。
每次 select 一个新的新 treeViewItem 时如何获取 header 的名称?
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!您提取 Header 并将其提供给 Methode,Method 正在显示一个带有文本作为参数的 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 的事实。