在视图模型之间传递参数

在我的应用程序中,我有2个意见。 列表(GridView)和表单。 我正在改变这个线程中提出的意见: WPF MVVM开关usercontrols

现在我有一个问题,如何通过点击编辑后显示新的视图编辑窗体通过选定项目的ID。

简单的应用程序列出所有项目,添加新的,删除和编辑。 我怎样才能在MVVWM中做到这一点?


UPDATE

我只是想创build一个简单的应用程序,左边有菜单:

  1. 名单
  2. 添新。

点击列表时,显示UC列表和3个button:添加,编辑,删除。 点击添加后,编辑它显示具有特定值(编辑时)的表单与UC。 我怎样才能做到这一点?

据我所知,你需要这样的东西:

主屏幕显示列表 所以,当你点击Add ,它显示这个: 主屏幕显示添加表单

对?

所以你需要以下行为:

  • 添加不需要任何ID。
  • 列表必须在添加完成后重新加载。
  • 编辑收到列表中select的项目ID。
  • 列表必须在添加完成后重新加载。

我会假设你正在使用某个存储库。

我提出了以下MVVM结构:

  • MainViewModel :主屏幕的DataContext。
    • BaseViewModel RightViewModel :显示在屏幕右侧的视图BaseViewModel RightViewModel的容器。
    • ICommand ViewListCommand :通过创build一个ListViewModel的新实例并将其分配给BaseViewModel属性来显示列表。
    • ICommand AddNewCommand :通过创buildAddViewModel的新实例并将其分配给BaseViewModel属性来显示addnew屏幕。

然后:

  • ListViewModel :单击List时右侧部分的DataContext。
    • List<Items> Items :提供要显示的项目。
    • Item SelectedItem :将绑定到UI上的Item SelectedItem的属性。
    • ICommand EditCommand :将获得所选项目并通知需要编辑的MainViewModel的命令。

所以在某些时候,一个视图模型会收到一个来自子视图模型的通知(即列表将告诉主要编辑事端)。 我build议通过使用事件来做到这一点:

 public class Item { public string Name { get; set; } } public class ItemEventArgs : EventArgs { public Item Item { get; set; } public ItemEventArgs(Item selectedItem) { this.Item = selectedItem; } } public class BaseViewModel { } public class ListViewModel : BaseViewModel { public event EventHandler<ItemEventArgs> EditItem; public Item SelectedItem { get; set; } public ICommand EditItemCommand { get; private set; } public ListViewModel() { this.EditItemCommand = new DelegateCommand(() => this.EditItem(this, new ItemEventArgs(this.SelectedItem))); } } public class EditViewModel : BaseViewModel { } public class MainViewModel { public BaseViewModel RightViewModel { get; private set; } public ICommand ViewListCommand { get; private set; } public MainViewModel() { this.ViewListCommand = new DelegateCommand(() => { // unhook possible previous events var listViewModel = new ListViewModel(); listViewModel.EditItem += listViewModel_EditItem; this.RightViewModel = listViewModel; }); } void listViewModel_EditItem(object sender, ItemEventArgs e) { // unhook possible previous events var editViewModel = new EditViewModel(); this.RightViewModel = editViewModel; } } 

xaml绑定不是必须的,因为它会很前进。

这是我认为如何处理这种东西的一个非常基本的例子。 这里重要的是要正确地解开事件,否则会遇到问题。

对于这种东西,你也可以看看Reactive UI 。

如果您拥有视图模型的共同父项,则可以使用该父项为您传递参数值。 只需在相关视图模型中设置一个或多个delegate

在相关参数更新的视图模型中,我们将其称为ParameterViewModel

 public delegate void ParameterChange(string parameter); public ParameterChange OnParameterChange { get; set; } 

在父母:

 ParameterViewModel viewModel = new ParameterViewModel(); viewModel.OnParameterChange += ParameterViewModel_OnParameterChange; ListMenu.Add(viewModel); // Add other view models 

当参数改变时返回ParameterViewModel

 public string Parameter { get { return parameter; } set { parameter = value; NotifyPropertyChanged("Parameter"); // Always check for null if (OnParameterChange != null) OnParameterChange(parameter); } } 

现在在父视图模型中:

 public void ParameterViewModel_OnParameterChange(string parameter) { // Do something with the new parameter data here AnotherViewModel anotherViewModel = (AnotherViewModel)ListMenu[someIndex]; anotherViewModel.Parameter = parameter; } 

您可以从MSDN上的委托(C#编程指南)页面了解更多关于使用delegate对象的信息。