TreeViewItem命令绑定

时间:2018-12-05 19:47:38

标签: c# wpf command treeview treeviewitem

我需要单击一个TreeViewItem并打开一个包含该TreeViewItem数据的对话框,稍后基于该数据,我将运行另一个命令。 我的实际问题是:我无法单击它,因为treeviewitem没有command属性。

我的场景:我有2个具有2个属性的模型,这些属性将用于创建TreeViewItems。我在ViewModel上创建它们,并根据它们的属性将它们组织在一起,然后将它们存储在One Collection中。

这是绑定元素的xaml:

<TreeView ItemsSource="{Binding Local}">
    <TreeView.DataContext>
    <data:ItemViewModel/>
    </TreeView.DataContext>
</Treeview>
//In my "Local" property i have 3 TreeViewItems with other items inside them wich i want to execute the commands

我找不到为该特定方案创建数据模板的方法。甚至试图创建一个内部带有超链接的数据模板(认为这是一个临时解决方案),但是不会执行任何命令。

2 个答案:

答案 0 :(得分:0)

MVVM模式将使用许多“从事件到命令”实现中的一种。您基本上将“事件到命令”对象绑定到Click事件,然后将VM中的命令绑定到“事件到命令”对象,并为您映射到幕后并处理所有启用/禁用的东西。 / p>

您可以在此处看到其中一种实现的示例: WPF Binding UI events to commands in ViewModel

答案 1 :(得分:0)

您应该绑定到一个集合,该集合的对象具有作为公共属性的集合,并按类型模板化为要在每个treeviewitem中看到的内容。

就像这个例子: https://docs.microsoft.com/en-us/dotnet/api/system.windows.hierarchicaldatatemplate?view=netframework-4.7.2

从技术上讲,您可以有一个按钮,其模板是文本块或其他内容,然后具有按钮的行为,例如单击和命令。 但是我更可能使用输入绑定。

这是一个例子:

 <DataTemplate DataType="{x:Type local:LineTerrainVM}">
    <Grid Background="Transparent">
        <Grid.InputBindings>
            <MouseBinding MouseAction="RightClick" Command="{Binding FixLineCommand}"/>
        </Grid.InputBindings>

您可以给定一个commandparameter =“ {Binding。}”,它将把viewmodel作为参数传递。 您还可以对TreeView的数据上下文使用relativesource来获取父视图模型,并在其中定义一个命令来完成您的工作。

由于您要执行的工作是视图职责,因此您可以依赖路由事件而不会“破坏” mvvm。可以在树视图级别处理任何treeviewitem中的单击,并使用原始源获得被单击的treeviewitem。然后为它的视图模型获取它的数据上下文。 粗略的想法:

    <TreeView Name="tv" ItemsSource="{Binding Families}"                   FrameworkElement.PreviewMouseLeftButtonDown="Tv_PreviewMouseLeftButtonDown"

处理程序:

    private void Tv_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var vm = ((FrameworkElement)e.OriginalSource).DataContext;
        // do something with viewmodel
    }

然后,您可以执行诸如新建对话框窗口之类的操作,将其数据上下文设置为您刚刚获得的视图模型,并对其进行显示对话。