首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >TreeViewItem命令绑定

TreeViewItem命令绑定
EN

Stack Overflow用户
提问于 2018-12-06 03:47:38
回答 2查看 135关注 0票数 -2

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

我的场景:我有两个模型和两个属性,将用于创建我的TreeViewItems。在我的ViewModel上,我创建它们,并根据它们的属性将它们组织在彼此内部,然后将它们存储在一个集合中。

下面是我绑定元素的xaml:

代码语言:javascript
复制
<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

我找不到一种方法来为那个特定的场景创建数据模板。甚至尝试创建一个包含超链接的数据模板(认为这是一个临时解决方案),但不会执行任何命令。

EN

回答 2

Stack Overflow用户

发布于 2018-12-06 04:03:26

MVVM模式是使用许多"Event to Command“实现中的一个。您基本上将"Event to Command“对象绑定到Click事件,然后VM中的命令被绑定到"Event to Command”对象,它将在幕后为您映射,并处理所有启用/禁用的内容。

您可以在这里看到其中一个实现的示例:WPF Binding UI events to commands in ViewModel

票数 0
EN

Stack Overflow用户

发布于 2018-12-06 04:43:11

你应该绑定到一个集合,该集合的对象有一个集合作为公共属性,并通过类型将其模板化到你想在每个treeviewitem中看到的任何东西。

如下面的示例:https://docs.microsoft.com/en-us/dotnet/api/system.windows.hierarchicaldatatemplate?view=netframework-4.7.2

从技术上讲,你可以有一个按钮,它的模板是文本块或其他东西,然后它将具有按钮的行为,如单击和命令。但我更有可能使用inputbinding。

下面是一个例子:

代码语言:javascript
复制
 <DataTemplate DataType="{x:Type local:LineTerrainVM}">
    <Grid Background="Transparent">
        <Grid.InputBindings>
            <MouseBinding MouseAction="RightClick" Command="{Binding FixLineCommand}"/>
        </Grid.InputBindings>

你可以给它一个绑定“{commandparameter= .}”,它会把视图模型作为一个参数来传递。你也可以使用树形视图的datacontext的relativesource来获取父视图模型,并在其中定义一个命令来做你的事情。

由于您要做事情是视图责任,因此您可以在不“破坏”mvvm的情况下依赖于路由的事件。在任何treeviewitem中的点击都可以在树视图级别进行处理,并使用originalsource获得被点击的treeviewitem。然后获取视图模型的数据上下文。粗略的想法:

代码语言:javascript
复制
    <TreeView Name="tv" ItemsSource="{Binding Families}"                   FrameworkElement.PreviewMouseLeftButtonDown="Tv_PreviewMouseLeftButtonDown"

和操控者:

代码语言:javascript
复制
    private void Tv_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var vm = ((FrameworkElement)e.OriginalSource).DataContext;
        // do something with viewmodel
    }

然后,您可以在对话框窗口中执行一些类似新建的操作,将其datacontext设置为您刚刚获得的视图模型,并对其进行显示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53639694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档