如何在Prism 5.0中为TreeviewItem编写EventToCommand

时间:2015-04-14 14:27:38

标签: c# wpf mvvm treeview prism

我有Treeview,它也有子节点并动态填充。视图的datacontext绑定到视图模型。当我双击树视图的任何级别时,我想获得树视图的选择项。我想为doubleclick事件编写EventToCommand。我不想在后面的代码中编写任何代码。

树视图的结构如下。我编写了InvokeCommandAction,使用delegate命令将doubleclick事件传递给viewmodel。这很有效。但是当我双击子节点时,我没有得到selecteditem。总是得到根名称。

<TreeView  Name="treeView" Background="Transparent" ItemsSource="{Binding TreeList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" > 
 <i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseDoubleClick">                    
        <prism:InvokeCommandAction Command="{Binding TreeNodeDoubleClickevent}" CommandParameter="{Binding  Path=SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeView}}}">
        </prism:InvokeCommandAction>
    </i:EventTrigger>
</i:Interaction.Triggers>  
<TreeView.ItemContainerStyle>
    <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="IsSelected" Value="{Binding IsSelected,Mode=TwoWay}" />
        <Setter Property="IsExpanded" Value="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type UserControl}},Path=DataContext.IsExpanded, Mode=TwoWay}" />
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="LightGray"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
    <HierarchicalDataTemplate  DataType="{x:Type provider:dataprovider}" ItemsSource="{Binding providerList}">
        <TextBlock  Text="{Binding Name}" Background="{Binding Property.Background}"  Tag="{Binding Parent}"  />
    </HierarchicalDataTemplate>               
</TreeView.ItemTemplate>

查看型号代码:

public class VM_TreeView : IVM_TreeView
{
    public DelegateCommand<CustomXML> TreeNodeDoubleClickevent { get; set; } 

    [ImportingConstructor]
    public VM_TreeView(IRegionManager regionManager)
        : base(regionManager)
    {
        RegionManager = regionManager; 
        TreeNodeDoubleClickevent = new DelegateCommand<CustomXML>(OnExecute_TreeNodeDouble_click);
    }

    public void OnExecute_TreeNodeDouble_click(CustomXML obj)
    {

    }

}

请帮助实现这一目标。

1 个答案:

答案 0 :(得分:1)

这对我来说很好。请参阅下面的代码。

<Window x:Class="TreeView_Learning.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TreeView_Learning"
     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:prism="clr-namespace:Microsoft.Practices.Prism.Interactivity;assembly=Microsoft.Practices.Prism.Interactivity"
    Title="MainWindow" Height="650" Width="525">  
<StackPanel>  
    <TreeView x:Name="tree" Width="500" Height="200" ItemsSource="{Binding NodeList}"
          VerticalAlignment="Top" HorizontalAlignment="Center"  >
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <prism:InvokeCommandAction Command="{Binding TreeNodeDoubleClickevent}" CommandParameter="{Binding  Path=SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeView}}}">
                </prism:InvokeCommandAction>
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children}">                    
                <TextBlock Text="{Binding NodeName}"/>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>       
</StackPanel>

  public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();           
        this.DataContext = new ViewModel();
    }
}

class ViewModel
{
    private ObservableCollection<Node> myVar;

    public ObservableCollection<Node> NodeList
    {
        get { return myVar; }
        set { myVar = value; }
    }

    public DelegateCommand<Node> TreeNodeDoubleClickevent { get; set; }

    public ViewModel()
    {
        NodeList = new ObservableCollection<Node>();
        Node nd = new Node();
        nd.NodeName = "Item 1.1"; 
        Node nd1 = new Node();
        nd1.NodeName = "Item 1.2";
        Node nd2 = new Node();
        nd2.NodeName = "Item 1";
        nd2.Children.Add(nd);
        nd2.Children.Add(nd1);
        NodeList.Add(nd2);
        TreeNodeDoubleClickevent = new DelegateCommand<Node>(MouseDoubleClick);
    }

    private void MouseDoubleClick(Node obj)
    {
        MessageBox.Show(obj.NodeName);
    }
}    

class Node
{
    private string nodeName;

    public string NodeName
    {
        get { return nodeName; }
        set { nodeName = value;  }
    }     

    private ObservableCollection<Node> myVar = new ObservableCollection<Node>();

    public ObservableCollection<Node> Children
    {
        get { return myVar; }
        set { myVar = value; }
    } 
}