【问题标题】:How do I pass a Treeview's SelectedItem to another command?如何将 Treeview 的 SelectedItem 传递给另一个命令?
【发布时间】:2011-10-29 21:05:12
【问题描述】:

我在 WPF MVVM 中使用分层 DAtaTemplate 属性创建了一个树视图。

在 Treeview 之外,我有一个“编辑”按钮。在按下编辑按钮时,我想将 Treeview 的 selectedItem 传递给视图模型中的 RelayCommand。

双击节点时,我在 TreeviewItem 中实现了相同的功能。不过,我想知道在外面完成此任务的最佳方法是什么。

我的代码结构如下

MainView -> MainViewModel

StateViewItem -> StateViewModel(继承自 TreeViewItemViewModel 的 HierarchicalDataTemplate)

RegionViewItem -> RegionViewModel(DataTemplate 继承自 TreeViewItemViewModel)

RegionViewModel 处理节点的双击并完成编辑功能。

但是“编辑”按钮在树视图之外,如何将选定的 RegionViewItem 传递给命令绑定,以便加载它进行编辑?

提前感谢您的帮助

【问题讨论】:

    标签: .net wpf mvvm wpf-controls binding


    【解决方案1】:

    RegionViewModel 是否可以访问StateViewModel?或者更重要的是,StateViewModel.SelectedItem? (一些代码会有所帮助)

    如果没有,您可能必须实现一个事件系统,每当StateViewModel.SelectedItem 发生变化时,它就会广播StateChanged 事件,而RegionViewModel 订阅该事件并跟踪SelectedState

    【讨论】:

    • 感谢您的回答!! RegionViewModel 有一个父属性,它可以访问 StateViewModel。 StateViewModel 有一个 Children 属性,它是 RegionViewModel 的集合。我不允许发布项目代码,但如果你需要我会创建一个复制并发布它
    • 我想我误读了您的问题...您是否有两种编辑方法,一种在 RegionViewModel 中可以双击,另一种在 MainViewModel(?) 中应该可以在 Button Click 上使用?
    • 我在 RegionViewModel 中有一个编辑方法,它将消息传递给另一个视图模型以加载区域进行编辑。在 MainViewModel 中,我想访问在 Treeview 中选择的 RegionViewModel 对象,以便我可以传递消息以加载区域进行编辑
    • 您的MainViewModel 可以访问StateViewModelMainView 访问TreeView 吗?如果您可以在问题中以伪代码绘制 XAML 布局或 ViewModel 层次结构,那将是最简单的。
    • 您好,我使用 MVVM Light 中的消息传递来实现这一点。
    【解决方案2】:

    以下代码仅用于 MVVM 的指导目的。它可能会/可能不会编译。

    方式一:

    假设您的TreeViewItemViewModel 是树中所有树视图项的基本项级别视图模型数据上下文,请在TreeViewItemViewModel 中添加一个名为IsSelected 的可写属性。不要忘记在IsSelected的Setter中通知属性变化。

    在您的 XAML 树视图中,将以下内容添加到针对 TreeViewItemStyle ....

      <TreeView.Resources>
          <Style TargetType="{x:Type TreeViewItem}">
              <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
          </Style> 
      </TreeView.Resources>
    

    这样,当任何 TreeView 被选中时,只有它自己的 TreeViewItemViewModelIsSelected 属性为真,其余所有树视图项都为假。所以剩下的任务是从绑定到TreeViewItemsSource的对象层次结构中找到选定的TreeViewItemViewModel对象。

    方式二:

    拥有 TreeViewItem 的附加属性并处理其 MouseDown 事件。检查 TreeViewItem 的 'IsSelected' 值是否为真并提取其数据上下文,这将是选定的TreeViewItemViewModel

      <TreeView.Resources>
          <Style TargetType="{x:Type TreeViewItem}">
              <Setter Property="local:MyAttachedBehavior.HandleMouseDown" Value="true" />
          </Style> 
      </TreeView.Resources>
    

    在静态HandleMouseDownPropertyChanged()依赖属性改变方法中,处理(TreeViewItem)sender上的MouseDown事件...

      ((TreeViewItem)sender).MouseDown += TreeViewMouseDownEventHandler;
    
      private static TreeViewMouseDownEventHandler(object sender, MouseButtonEventArgs e)
      {
          var treeViewItem = (TreeViewItem)sender;
          if (treeViewItem.IsSelected)
          {
                var mySelectedItem = treeViewItem.DataContext as TreeViewItemViewModel; 
          } 
      }
    

    将此选定的“TreeViewItemViewModel”实例作为所需的选定项传递给您的例程。

    如果这有帮助,请告诉我。

    【讨论】:

    • 谢谢,我现在正在尝试 Way1。会告诉你它是否有效
    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2016-01-30
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    相关资源
    最近更新 更多