代码之家  ›  专栏  ›  技术社区  ›  RUL JohnnyQ

如何将选定的TreeView项传递给RelayCommand而不带代码隐藏

  •  1
  • RUL JohnnyQ  · 技术社区  · 8 年前

    我有一个 TreeView 用我的自定义类型的项目填充 ToolbarTreeItem .现在,当用户单击某个项目时,我想知道在 MainViewModel .

    我希望在没有代码隐藏的情况下实现这一点,但是 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 回复  |  直到 8 年前
        1
  •  0
  •   Rekshino    8 年前

    行为:

    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(XAML):

    xmlns:i=“clr命名空间:system.windows.interactivity;assembly=system.windows.interactivity” xmlns:b=“clr-namespace:namespace,其中bahaviordefined”

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