Как передать выбранный элемент TreeView в RelayCommand без кода позади - PullRequest
0 голосов
/ 27 июня 2018

У меня есть 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-фрагмент на Панели инструментов. Xaml:

<TreeView SelectedItemChanged="???" />

1 Ответ

0 голосов
/ 27 июня 2018

Поведение:

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: я = "CLR-имена: System.Windows.Interactivity; сборка = System.Windows.Interactivity" XMLNS: б = "CLR-имена: NameSpaceWhereBahaviorDefined"

<TreeView ...>
    <i:Interaction.Behaviors>
        <b:TreeViewSelection  CurrentSelection = "{Binding VMSelection}" />
    </i:Interaction.Behaviors>
</TreeView>
...