我正在尝试使用Caliburn.Micro在WPF TreeView上实现复制和粘贴,但我在开始时卡住了。问题是我不知道在调用事件时复制或粘贴TreeView上的当前项。下面是TreeView和事件处理程序的xaml。有什么建议吗?
<TreeView Name="Nodes" AllowDrop="True">
<TreeView.ContextMenu>
<ContextMenu ItemsSource="{Binding MenuItems}">
<MenuItem Header="Copy" cal:Message.Attach="[Event Click] = [Action Copy($source, $eventArgs)]"></MenuItem>
<MenuItem Header="Cut" cal:Message.Attach="[Event Click] = [Action Cut]"></MenuItem>
<MenuItem Header="Paste" cal:Message.Attach="[Event Click] = [Action Paste($this)]" IsEnabled="{Binding IsPasteEnabled}"></MenuItem>
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
<Setter Property="Command" Value="{Binding MenuCommand}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
</TreeView.ContextMenu>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding Childs}" DataType="{x:Type viewmodels:TreeListViewModel+Node}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
public void Copy(object sender, RoutedEventArgs args)
{
// to do...
}
编辑: 资料来源:http://dfiles.eu/files/bsm545ti3
答案 0 :(得分:2)
这可能没用,但我使用cal:Action.TargetWithoutContext
属性做了类似的事情来解析DataContext
到特定的ViewModel
。在我的情况下,我有几种不同类型的ViewModel
都继承自基类TreeViewItemViewModel
类,但这不应该是你需要在这里考虑的事情。
基本上,我将DataContext
的{{1}}设置为当前ContextMenu
节点所代表的实际ViewModel
,允许我调用我已定义的操作TreeView
。
在您的情况下,您可能不希望在ViewModel
上定义通用的复制/粘贴,但您可以触发ViewModel
/ Copy
/ {{1}每个Cut
的事件(使用Paste
Caliburn.Micro
),将自己传递给事件信息。
重要的一点:
EventAggregator
我根据节点所代表的内容定义了不同的ViewModels
,因此它存在于<ContextMenu cal:Action.TargetWithoutContext="{Binding DataContext, RelativeSource={RelativeSource Self}}">
中。它看起来像这样(我使用ContextMenu
来显示多个对象,如果单击HierarchicalDataTemplate
本身,则会显示StackPanel
。
ContextMenu
可能有一种更简单/直接的方法。
还值得搜索StackPanel
讨论,例如:http://caliburnmicro.codeplex.com/discussions/256163