我需要单击一个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
我找不到为该特定方案创建数据模板的方法。甚至试图创建一个内部带有超链接的数据模板(认为这是一个临时解决方案),但是不会执行任何命令。
答案 0 :(得分:0)
MVVM模式将使用许多“从事件到命令”实现中的一种。您基本上将“事件到命令”对象绑定到Click事件,然后将VM中的命令绑定到“事件到命令”对象,并为您映射到幕后并处理所有启用/禁用的东西。 / p>
您可以在此处看到其中一种实现的示例: WPF Binding UI events to commands in ViewModel
答案 1 :(得分:0)
您应该绑定到一个集合,该集合的对象具有作为公共属性的集合,并按类型模板化为要在每个treeviewitem中看到的内容。
从技术上讲,您可以有一个按钮,其模板是文本块或其他内容,然后具有按钮的行为,例如单击和命令。 但是我更可能使用输入绑定。
这是一个例子:
<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
}
然后,您可以执行诸如新建对话框窗口之类的操作,将其数据上下文设置为您刚刚获得的视图模型,并对其进行显示对话。