【问题标题】:TreeViewItem Command bindingTreeViewItem 命令绑定
【发布时间】:2019-05-07 11:00:47
【问题描述】:

我需要单击一个 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

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

【问题讨论】:

  • 您也许可以在您的视图模型中创建一个属性(具有Local 属性的属性,该属性为TreeView 提供其TreeView.ItemsSource 的根节点/集合),您将其绑定到TreeView.SelectedItem .每当 TreeView 中的选定项目发生更改时,将调用视图模型中此属性的 getter,您可以以“does stuff”的方式实现它。

标签: c# wpf command treeview treeviewitem


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    喜欢这个示例: 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 .}" ,它会将视图模型作为参数传递。 您还可以使用树视图的数据上下文的 relativesource 来获取父视图模型并在其中定义一个命令来完成您的工作。

    由于您想做的事情是视图责任,因此您可以依赖路由事件而不会“破坏” mvvm。可以在树视图级别处理任何树视图项中的单击,并使用原始源来获取单击的树视图项。然后抓住它的数据上下文以获取任何视图模型。 粗略的想法:

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

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

    【讨论】:

    • 这与大多数人对 mvvm 的概念背道而驰 :)。
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2011-04-13
    • 2010-12-23
    相关资源
    最近更新 更多