【问题标题】:How to bind to a method on ViewModel with data from View如何使用来自 View 的数据绑定到 ViewModel 上的方法
【发布时间】:2013-06-28 01:58:12
【问题描述】:

我目前有一个带有 3 个相当简单的视图模型的视图。为了便于讨论,我们将重点关注三个视图模型中的两个。

视图是用户管理用户控件。它包含一个 DataGrid,它的 ItemsSource 绑定设置为 UserListViewModel。此视图模型仅在数据网格中显示用户信息。

用户管理视图还包含一些其他控件,例如用于添加新用户和删除用户的按钮。这些按钮当前绑定到称为 UserManagementViewModel 的第二个视图模型。例如,Remove 按钮将成功调用 UserManagementViewModel 上的 RemoveUser 方法。

我的问题是,通过 XAML(因为我讨厌代码隐藏),如何将 DataGrid 的 SelectedItem 属性(绑定到 UserListViewModel)传递到 UserManagementViewModel 上的 RemoveUser 方法调用中?我意识到,在 MVVM 设计模式中,我的视图模型无法查看视图以检索必要的信息,因此必须有一种方法通过绑定将这些信息传递给方法。

XAML 代码示例(或说明如何执行的链接)将不胜感激。感谢您的帮助!

【问题讨论】:

    标签: wpf xaml mvvm


    【解决方案1】:

    您可以简单地使用命令参数

     <Button Command="{Binding RemoveCommand} CommandParameter="{Binding Elementname=gridUser, Path=SelectedItem}" />
    

    或者您的 UserManagementViewModel 可以访问 UserListViewModel,那么您需要一个没有命令参数的命令,只需使用您的 UserListViewModel 实例的 SelectedUser 属性

     public void ExecuteRemove()
     {
        var userToRemove = this._myUserListViewModelinstance.SelectedUser;
        ...
     }
    

    【讨论】:

    • 让两个视图模型“了解”彼此会破坏 MVVM 模式。我认为使用命令参数正是我正在寻找的。谢谢!
    • @Jason 两个相互了解的视图模型不会破坏 MVVM 本身。 MVVM 的理念是视图模型不知道如何它们将被呈现。但他们仍然知道会发生什么
    【解决方案2】:

    我相信您所寻求的是使用绑定到数据网格的选定项的命令目标进行命令,其中可以从数据网格路由此类信息;说当按下按钮时。

    请参阅 MSDN 上的 Commanding Overview

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      相关资源
      最近更新 更多