首页 > 解决方案 > 如何在 mvvm 模式中双击 treeItem?

问题描述

我通过日期绑定在 mvvm 模式中有一个 treeView,并通过System.Windows.Interactivity.

在 SomeMethod 中我想通过 Model 做一些事情,所以我想知道如何获得我双击的 Model ?

这是 xaml 中的 TreeView

<TreeView  Grid.Column="0" ItemsSource="{Binding TreeNodes}" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDoubleClick">
                    <i:InvokeCommandAction Command="{Binding SomeMethod}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=Models}">
                    <TextBlock Text="{Binding Name}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

树节点是

 public ObservableCollection<TreeNode> TreeNodes { get; set; } = new ObservableCollection<TreeNode>();

和 TreeNode 是

 public class TreeNode
    {
        public string Name { get; set; }
        public List<Model> Models { get; set; }
    }

型号是

public class Model
    {
         public string Name { get; set; }
    }

所以像这样的树

---TreeNode1
   ---Model1
   ---Model2
---TreeNode2
   ---Model3

标签: c#wpfmvvm

解决方案


您可以使用附加行为:

public static class ItemDoubleClickBehavior
{
    public static ICommand GetCommand(TreeViewItem obj) => (ICommand)obj.GetValue(CommandProperty);

    public static void SetCommand(TreeViewItem obj, ICommand value) => obj.SetValue(CommandProperty, value);

    public static object GetCommandParameter(TreeViewItem obj) => obj.GetValue(CommandParameterProperty);

    public static void SetCommandParameter(TreeViewItem obj, object value) => obj.SetValue(CommandParameterProperty, value);

    public static readonly DependencyProperty CommandProperty =
        DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(ItemDoubleClickBehavior), new PropertyMetadata(null, OnCommandChanged));

    public static readonly DependencyProperty CommandParameterProperty =
        DependencyProperty.RegisterAttached("CommandParameter", typeof(object), typeof(ItemDoubleClickBehavior));

    private static void OnCommandChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        TreeViewItem tvi = (TreeViewItem)sender;
        tvi.MouseDoubleClick += Lvi_MouseDoubleClick;
    }

    private static void Lvi_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        TreeViewItem tvi = (TreeViewItem)sender;
        ICommand command = GetCommand(tvi);
        if (command != null)
            command.Execute(GetCommandParameter(tvi));
    }
}

XAML:

<TreeView ItemsSource="{Binding TreeNodes}" >
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="local:ItemDoubleClickBehavior.Command"
                    Value="{Binding DataContext.SomeCommand, RelativeSource={RelativeSource AncestorType=TreeView}}" />
            <Setter Property="local:ItemDoubleClickBehavior.CommandParameter" Value="{Binding}" />
        </Style>
    </TreeView.Resources>
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Models}">
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

推荐阅读