猿问

WPF树视图中的SelectedItem数据绑定

WPF树视图中的SelectedItem数据绑定

如何检索在WPF-TreeView中选择的项?我想在XAML中这样做,因为我想绑定它。

你可能会认为SelectedItem但很明显不存在是只读的,因此是不可用的。

这就是我想做的:

<TreeView ItemsSource="{Binding Path=Model.Clusters}" 
            ItemTemplate="{StaticResource ClusterTemplate}"
            SelectedItem="{Binding Path=Model.SelectedCluster}" />

我想绑定SelectedItem我的模型上的一个属性。

但这给了我一个错误:

“SelectedItem”属性是只读的,不能从标记中设置。

编辑:好吧,这就是我解决这个问题的方法:

<TreeView
          ItemsSource="{Binding Path=Model.Clusters}" 
          ItemTemplate="{StaticResource HoofdCLusterTemplate}"
          SelectedItemChanged="TreeView_OnSelectedItemChanged" />

在我的XAML的代码文件中:

private void TreeView_OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e){
    Model.SelectedCluster = (Cluster)e.NewValue;}


慕码人8056858
浏览 2596回答 3
3回答

慕尼黑8549860

我知道这个答案已经被接受了,但是我把它放在一起来解决这个问题。它使用了与Delta的解决方案类似的想法,但不需要子类TreeView:public&nbsp;class&nbsp;BindableSelectedItemBehavior&nbsp;:&nbsp;Behavior<TreeView>{ &nbsp;&nbsp;&nbsp;&nbsp;#region&nbsp;SelectedItem&nbsp;Property &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;object&nbsp;SelectedItem &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{&nbsp;return&nbsp;(object)GetValue(SelectedItemProperty);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;{&nbsp;SetValue(SelectedItemProperty,&nbsp;value);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;readonly&nbsp;DependencyProperty&nbsp;SelectedItemProperty&nbsp;= &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DependencyProperty.Register("SelectedItem",&nbsp;typeof(object),&nbsp;typeof(BindableSelectedItemBehavior),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;UIPropertyMetadata(null,&nbsp;OnSelectedItemChanged)); &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;OnSelectedItemChanged(DependencyObject&nbsp;sender,&nbsp;DependencyPropertyChangedEventArgs&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;item&nbsp;=&nbsp;e.NewValue&nbsp;as&nbsp;TreeViewItem; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(item&nbsp;!=&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.SetValue(TreeViewItem.IsSelectedProperty,&nbsp;true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;#endregion &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;override&nbsp;void&nbsp;OnAttached() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base.OnAttached(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.AssociatedObject.SelectedItemChanged&nbsp;+=&nbsp;OnTreeViewSelectedItemChanged; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;override&nbsp;void&nbsp;OnDetaching() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base.OnDetaching(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.AssociatedObject&nbsp;!=&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.AssociatedObject.SelectedItemChanged&nbsp;-=&nbsp;OnTreeViewSelectedItemChanged; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;OnTreeViewSelectedItemChanged(object&nbsp;sender,&nbsp;RoutedPropertyChangedEventArgs<object>&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.SelectedItem&nbsp;=&nbsp;e.NewValue; &nbsp;&nbsp;&nbsp;&nbsp;}}然后,您可以在XAML中将其用作:<TreeView> &nbsp;&nbsp;&nbsp;&nbsp;<e:Interaction.Behaviors> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<behaviours:BindableSelectedItemBehavior&nbsp;SelectedItem="{Binding&nbsp;SelectedItem,&nbsp;Mode=TwoWay}"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;</e:Interaction.Behaviors></TreeView>希望它能帮助别人!

海绵宝宝撒

我找到了解决办法。它移动混乱,以便MVVM工作。首先添加以下类:public&nbsp;class&nbsp;ExtendedTreeView&nbsp;:&nbsp;TreeView{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ExtendedTreeView() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;base() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.SelectedItemChanged&nbsp;+=&nbsp;new&nbsp;RoutedPropertyChangedEventHandler<object>(___ICH); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;___ICH(object&nbsp;sender,&nbsp;RoutedPropertyChangedEventArgs<object>&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(SelectedItem&nbsp;!=&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetValue(SelectedItem_Property,&nbsp;SelectedItem); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;object&nbsp;SelectedItem_ &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;{&nbsp;return&nbsp;(object)GetValue(SelectedItem_Property);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;{&nbsp;SetValue(SelectedItem_Property,&nbsp;value);&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;readonly&nbsp;DependencyProperty&nbsp;SelectedItem_Property&nbsp;=&nbsp;DependencyProperty.Register("SelectedItem_",&nbsp;typeof(object),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;typeof(ExtendedTreeView),&nbsp;new&nbsp;UIPropertyMetadata(null));}并将其添加到您的XAML中:&nbsp;<local:ExtendedTreeView&nbsp;ItemsSource="{Binding&nbsp;Items}"&nbsp;SelectedItem_="{Binding&nbsp;Item,&nbsp;Mode=TwoWay}"> &nbsp;.....&nbsp;</local:ExtendedTreeView>
随时随地看视频慕课网APP
我要回答