如何检索在WPF树视图中选择的项目?我想在XAML中这样做,因为我想绑定它 .
您可能认为它是 SelectedItem
但显然不存在是只读的,因此无法使用 .
这就是我想要做的:
<TreeView ItemsSource="{Binding Path=Model.Clusters}"
ItemTemplate="{StaticResource ClusterTemplate}"
SelectedItem="{Binding Path=Model.SelectedCluster}" />
我想将 SelectedItem
绑定到我的Model上的属性 .
但这给了我错误:
'SelectedItem'属性是只读的,不能通过标记设置 .
Edit: 好的,这就是我解决这个问题的方法:
<TreeView
ItemsSource="{Binding Path=Model.Clusters}"
ItemTemplate="{StaticResource HoofdCLusterTemplate}"
SelectedItemChanged="TreeView_OnSelectedItemChanged" />
在我的xaml的codebehindfile中:
private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
Model.SelectedCluster = (Cluster)e.NewValue;
}
19 回答
一切都很复杂......跟Caliburn Micro一起去(http://caliburnmicro.codeplex.com/)
视图:
视图模型:
我意识到这已经接受了答案,但我把它放在一起解决问题 . 它使用与Delta的解决方案类似的想法,但不需要继承TreeView:
然后,您可以在XAML中使用它:
希望它会帮助别人!
此属性存在:TreeView.SelectedItem
但它只是readonly,因此您无法通过绑定分配它,只能检索它
好吧,我找到了解决方案 . 它移动了混乱,以便MVVM工作 .
首先添加这个类:
并将其添加到您的xaml:
如果需要,请回答附加属性并且没有外部依赖性!
您可以创建一个可绑定的附加属性,并具有一个getter和setter:
将包含该类的名称空间声明添加到XAML并按如下方式绑定(本地是我命名名称空间声明的方式):
现在,您可以绑定所选项目,并在视图模型中将其设置为以编程方式更改它,如果该要求出现的话 . 当然,这是假设您在该特定属性上实现INotifyPropertyChanged .
它的回答比OP预期的要多一点......但我希望它至少可以帮助一些人 .
如果要在
SelectedItem
更改时执行ICommand
,则可以在事件上绑定命令,并且不再需要在ViewModel
中使用属性SelectedItem
.为此:
1-添加对
System.Windows.Interactivity
的引用2-将命令绑定到事件
SelectedItemChanged
这可以通过仅使用绑定和GalaSoft MVVM Light库的EventToCommand以更好的方式完成 . 在您的VM中添加一个命令,该命令将在更改所选项目时调用,并初始化该命令以执行必要的操作 . 在这个例子中,我使用了一个RelayCommand,只是设置了SelectedCluster属性 .
然后在xaml中添加EventToCommand行为 . 使用混合物非常容易 .
我遇到了这个寻找与原作者相同答案的页面,并且证明总是有不止一种方法可以做到这一点,对我来说解决方案比到目前为止提供的答案更容易,所以我想我不妨添加到了一堆 .
绑定的动机是保持它和MVVM . ViewModel的可能用法是使用具有诸如“CurrentThingy”之类的名称的属性,并且在其他地方,将某些其他东西上的DataContext绑定到“CurrentThingy” .
而不是通过所需的其他步骤(例如:自定义行为,第三方控件)来支持从TreeView到我的模型的良好绑定,然后从其他东西到我的模型,我的解决方案是使用简单的元素绑定另一个东西到TreeView.SelectedItem,而不是将其他东西绑定到我的ViewModel,从而跳过所需的额外工作 .
XAML:
当然,这非常适合阅读当前所选项目,但不能设置它,这就是我所需要的 .
您也可以使用TreeViewItem.IsSelected属性
还有一种方法可以在不使用Interaction.Behaviors的情况下创建XAML可绑定SelectedItem属性 .
然后,您可以在XAML中使用它:
我试过这个问题的所有解决方案 . 没有人完全解决我的问题 . 所以我认为最好将这样的继承类与重新定义的属性SelectedItem一起使用 . 如果从GUI中选择树元素并在代码中设置此属性值,它将完美地工作
我建议增加Steve Greatrex提供的行为 . 他的行为并不反映来自源的更改,因为它可能不是TreeViewItems的集合 . 所以这是在树中找到TreeViewItem的问题,datacontext是来自源的selectedValue . TreeView有一个名为“ItemsHost”的受保护属性,它保存TreeViewItem集合 . 我们可以通过反射得到它并走树搜索所选项目 .
这种行为适用于双向绑定 . 或者,可以将ItemsHost采集移动到Behavior的OnAttached方法,从而节省每次绑定时使用反射的开销更新 .
WPF MVVM TreeView SelectedItem
...是一个更好的答案,但没有提到在ViewModel中获取/设置SelectedItem的方法 .
将IsSelected布尔属性添加到ItemViewModel,并在TreeViewItem的样式设置器中绑定它 .
将SelectedItem属性添加到用作TreeView的DataContext的ViewModel . 这是上述解决方案中缺失的部分 .
我的要求是基于PRISM-MVVM的解决方案,其中需要TreeView,绑定对象的类型为Collection <>,因此需要HierarchicalDataTemplate . 默认的BindableSelectedItemBehavior将无法识别子TreeViewItem . 使其在此方案中起作用 .
这使得能够迭代所有元素而不管级别 .
在研究了互联网一天后,我在 normal WPF / C#环境中创建 normal 树视图后找到了自己选择项目的解决方案
它也可以使用TreeView项的IsSelected属性来完成 . 这是我管理它的方式,
然后在包含TreeView绑定的数据的ViewModel中,只需订阅TreeViewItem类中的事件 .
最后,在同一个ViewModel中实现这个处理程序,
而绑定当然,
我为您带来了我的解决方案,它提供以下功能:
支持2种方式绑定
自动更新TreeViewItem.IsSelected属性(根据SelectedItem)
没有TreeView子类化
绑定到ViewModel的项可以是任何类型(甚至为null)
1 /在CS中粘贴以下代码:
2 /在XAML文件中使用的示例
(让我们都同意TreeView在这个问题上明显被破坏 . 绑定到SelectedItem会很明显 . 叹气)
我需要解决方案与TreeViewItem的IsSelected属性正确交互,所以这是我如何做到的:
有了这个XAML:
如果XAML有
在列表中找到该项目有什么问题?我也用
为了确保我在VM中设置IsSelected = true时父项被扩展 .