c# - 如何将选定的TreeView项目传递给RelayCommand,而无需后面的代码

标签 c# wpf mvvm mvvm-light relaycommand

我的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;
       }));
    }
}

Toolbar.xaml中的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>

关于c# - 如何将选定的TreeView项目传递给RelayCommand,而无需后面的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51062216/

相关文章:

c# - SignalR ASPNetHost 在当前上下文中不存在

wpf - 使用 MVVM 显示 View 的正确方法

c# - 在 WPF 中将 TabItem 转换为 UserControl

wpf - 使用WPF M-V-VM模式显示弹出窗口的正确方法

c# - Selenium 在 WaitForElement 之后抛出 "Element No Longer Valid"

c# - 更改 Nhibernate 连接字符串

c# - 无法找到该资源。 MVC4

c# - WPF DoubleUpDown 命令绑定(bind)到上下按钮

Silverlight 与 MVVM 继承 : ModelView and View matching the Model

asp.net-mvc - ViewModel不填充输入字段