如何在没有代码隐藏的情况下将选定的 TreeView 项目传递给 RelayCommand
How to pass selected TreeView item to the RelayCommand without code behind
我有一个 TreeView
装满了我的自定义类型 ToolbarTreeItem
的项目。现在当用户点击一个项目时,我想知道在 MainViewModel
.
中点击了哪个项目
我想在没有代码隐藏的情况下实现这一点,但有 RelayCommand
。
那么如何将所选项目传递给 RelayCommand
而不必使用标准事件,这会导致代码隐藏?
MainViewModel.cs 中的代码片段:
private ToolbarTreeItem _selectedItem;
private RelayCommand<ToolbarTreeItem> _changeSelectedItem;
public RelayCommand<ToolbarTreeItem> ChangeSelectedItem
{
get
{
return _changeSelectedItem ?? (_changeSelectedItem = new RelayCommand<ToolbarTreeItem>(selectedItem =>
{
_selectedItem = selectedItem;
}));
}
}
Xaml-Toolbar.xaml 中的片段:
<TreeView SelectedItemChanged="???" />
行为:
public class TreeViewSelection : Behavior<TreeView>
{
public static readonly DependencyProperty CurrentSelectionProperty = DependencyProperty.Register("CurrentSelection", typeof(object), typeof(TreeViewSelection), new PropertyMetadata(default(object)));
public object CurrentSelection
{
get
{
return (object)GetValue(CurrentSelectionProperty);
}
set
{
SetValue(CurrentSelectionProperty, value);
}
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SelectedItemChanged += TreeView_SelectedItemChanged;
}
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
CurrentSelection = e.NewValue;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.SelectedItemChanged -= TreeView_SelectedItemChanged;
}
}
XAML:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:b="clr-namespace:NameSpaceWhereBahaviorDefined"
<TreeView ...>
<i:Interaction.Behaviors>
<b:TreeViewSelection CurrentSelection = "{Binding VMSelection}" />
</i:Interaction.Behaviors>
</TreeView>
我有一个 TreeView
装满了我的自定义类型 ToolbarTreeItem
的项目。现在当用户点击一个项目时,我想知道在 MainViewModel
.
我想在没有代码隐藏的情况下实现这一点,但有 RelayCommand
。
那么如何将所选项目传递给 RelayCommand
而不必使用标准事件,这会导致代码隐藏?
MainViewModel.cs 中的代码片段:
private ToolbarTreeItem _selectedItem;
private RelayCommand<ToolbarTreeItem> _changeSelectedItem;
public RelayCommand<ToolbarTreeItem> ChangeSelectedItem
{
get
{
return _changeSelectedItem ?? (_changeSelectedItem = new RelayCommand<ToolbarTreeItem>(selectedItem =>
{
_selectedItem = selectedItem;
}));
}
}
Xaml-Toolbar.xaml 中的片段:
<TreeView SelectedItemChanged="???" />
行为:
public class TreeViewSelection : Behavior<TreeView>
{
public static readonly DependencyProperty CurrentSelectionProperty = DependencyProperty.Register("CurrentSelection", typeof(object), typeof(TreeViewSelection), new PropertyMetadata(default(object)));
public object CurrentSelection
{
get
{
return (object)GetValue(CurrentSelectionProperty);
}
set
{
SetValue(CurrentSelectionProperty, value);
}
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SelectedItemChanged += TreeView_SelectedItemChanged;
}
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
CurrentSelection = e.NewValue;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.SelectedItemChanged -= TreeView_SelectedItemChanged;
}
}
XAML:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:b="clr-namespace:NameSpaceWhereBahaviorDefined"
<TreeView ...>
<i:Interaction.Behaviors>
<b:TreeViewSelection CurrentSelection = "{Binding VMSelection}" />
</i:Interaction.Behaviors>
</TreeView>