【问题标题】:How to pass selected TreeView item to the RelayCommand without code behind如何在没有代码的情况下将选定的 TreeView 项传递给 RelayCommand
【发布时间】:2018-12-06 07:35:09
【问题描述】:

我有一个 TreeView 填充了我的自定义类型 ToolbarTreeItem 的项目。现在当用户点击一个项目时,我想知道MainViewModel中点击了哪个项目。

我想在没有代码的情况下实现这一点,但使用RelayCommand

那么如何在不使用标准事件的情况下将所选项目传递给RelayCommand,这会导致代码落后?

MainViewModel.cs 中的代码-sn-p:

private ToolbarTreeItem _selectedItem;

private RelayCommand<ToolbarTreeItem> _changeSelectedItem;
public RelayCommand<ToolbarTreeItem> ChangeSelectedItem
{
    get
    {
        return _changeSelectedItem ?? (_changeSelectedItem = new RelayCommand<ToolbarTreeItem>(selectedItem =>
       {
           _selectedItem = selectedItem;
       }));
    }
}

Toolbar.xaml 中的 Xaml-sn-p:

<TreeView SelectedItemChanged="???" />

【问题讨论】:

  • @ASh,但我在 Xaml 中没有此属性,只有在代码中访问 TreeView 时才可用。
  • 行为、转换器在您看来也算作代码隐藏吗?
  • @Rekshino,不,但你知道吗,使用其中任何一个都有可能吗?
  • 当然!在行为中,您可以访问 TreeView 的每个事件和属性。您可以随时在 xaml 中附加此行为

标签: c# wpf mvvm mvvm-light relaycommand


【解决方案1】:

行为:

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2021-09-04
    • 1970-01-01
    相关资源
    最近更新 更多