TreeViewItem命令绑定

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (127)

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

我的情况:我有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

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

提问于
用户回答回答于

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

像这样的示例:https//docs.microsoft.com/en-us/dotnet/api/system.windows.hierarchicaldatatemplate?view = networkwork4.7.2

从技术上讲,你可以有一个按钮,其模板是一个文本块或其他东西,然后会有一个按钮的行为,如click和command。但我更有可能使用输入绑定。

这是一个例子:

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

你可以给它一个commandparameter =“{Binding。}”,它会传递viewmodel作为参数。您还可以将relativesource用于树视图的datacontext以获取父视图模型,并在其中定义一个命令来执行您的操作。

因为您想要做的事情是视图责任,您可以依赖路由事件而不“破坏”mvvm。可以在树视图级别处理任何treeviewitem中的单击,并使用originalsource到达单击的treeviewitem。然后抓住它的datacontext以获取任何视图模型。粗略的想法:

    <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
    }

然后你可以做一些新的对话窗口,将它的datacontext设置为你刚刚获得的viewmodel并显示它。

用户回答回答于

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

所属标签

可能回答问题的人

  • 嗨喽你好

    7 粉丝480 提问8 回答
  • 人生的旅途

    10 粉丝484 提问7 回答
  • uncle_light

    5 粉丝518 提问7 回答
  • 无聊至极

    4 粉丝504 提问6 回答

扫码关注云+社区

领取腾讯云代金券