使用Caliburn.Micro在TreeView上复制/粘贴

时间:2013-11-29 14:54:50

标签: c# wpf xaml treeview caliburn.micro

我正在尝试使用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

1 个答案:

答案 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