c# - 如何在 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
解决方案
您可以使用附加行为:
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>
推荐阅读
- mpi - pytorch数据并行模式下,如何使用全局张量?
- node.js - 如何在 NodeJS 中构建网络嗅探器
- python - “x:”和以下行的含义是什么?
- node.js - 无法连接到 MongoDB 并出现错误 UnhandledPromiseRejectionWarning
- ffmpeg - FFMPEG 延迟多个叠加视频(具有不同的延迟)
- google-apps-script - 如何在 Google Apps 脚本中使用服务帐户验证 Google 表格
- mysql - MySQL 错误代码 1215:“无法添加外键约束”
- c# - 带有BackgroundService的QueueClient无法正常工作.NetCore2.2
- xml - 每次发布知识库后从 QnA Maker 中删除 XML 格式文本
- javascript - Redux Mock Store 给出 'Actions must be plain objects。使用自定义中间件进行异步操作。