代码之家  ›  专栏  ›  技术社区  ›  Rob

C#wpf mvvm通过单击按钮在treeview中标识所选节点

  •  0
  • Rob  · 技术社区  · 7 年前

    enter image description here

    Treeview绑定到viewmodel,我有一个属性来保存这样的值,当您单击加号按钮时,所选节点的值应该被设置。只有当您在单击加号按钮之前先单击“示例节点”时,才会设置所选值。下面是我的xaml代码:

    <TreeView x:Name="tree" ItemsSource="{Binding SectorTree, Mode=OneWay}" MinHeight="150">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Children, Mode=OneTime}">
                <StackPanel Orientation="Horizontal">
                    <Button HorizontalAlignment="Center" Command="{Binding SelectedItemChangedCommand, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                                ToolTip="Edit sector name" Background="Transparent" BorderThickness="0">
                        <Button.Content>
                            <Image Width="14" Height="14" Margin="0,0,0,0" Source="path_of_image" />
                        </Button.Content>
                    </Button>
                    <ContentPresenter Content="{Binding SectorName, Mode=OneTime}" Margin="2,0" />
                </StackPanel>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsSelected" Value="{Binding IsSelected,  Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Peregrine    7 年前

    通过将此按钮添加到TreeView数据模板来解决什么问题尚不清楚。

    树视图已经有一个 SelectedItemChanged 事件,以及 SelectedItem 财产。

    Behavior 向树视图添加新的可绑定BoundSelectedItem属性。这将返回数据项类,而不是TreeViewItem实例。

    public class perTreeViewHelper : Behavior<TreeView>
    {
        public object BoundSelectedItem
        {
            get => GetValue(BoundSelectedItemProperty);
            set => SetValue(BoundSelectedItemProperty, value);
        }
    
        public static readonly DependencyProperty BoundSelectedItemProperty =
            DependencyProperty.Register("BoundSelectedItem",
                typeof(object),
                typeof(perTreeViewHelper),
                new FrameworkPropertyMetadata(null,
                    FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    OnBoundSelectedItemChanged));
    
        private static void OnBoundSelectedItemChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            if (args.NewValue is perTreeViewItemViewModelBase item)
                item.IsSelected = true;
        }
    
        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.SelectedItemChanged += OnTreeViewSelectedItemChanged;
        }
    
        protected override void OnDetaching()
        {
            AssociatedObject.SelectedItemChanged -= OnTreeViewSelectedItemChanged;
            base.OnDetaching();
        }
    
        private void OnTreeViewSelectedItemChanged(object obj, RoutedPropertyChangedEventArgs<object> args)
        {
            BoundSelectedItem = args.NewValue;
        }
    }
    

    更多关于我最近 blog post .

        2
  •  0
  •   PeterE    7 年前

    这就是我如何在树视图中的按钮单击事件中解决相同问题的方法。

    1. 将“Me”属性添加到绑定到每个TreeView节点的MyNodeClass:

      public object Me { get { return this; } }
      
    2. 将按钮的标记属性绑定到我:

      Button Tag="{Binding Me}" Click="Button_Click"
      
    3. MyNodeClass x = ((Button)sender).Tag as MyNodeClass