在视图模型之间传递参数
在我的应用程序中,我有2个意见。 列表(GridView)和表单。 我正在改变这个线程中提出的意见: WPF MVVM开关usercontrols
现在我有一个问题,如何通过点击编辑后显示新的视图编辑窗体通过选定项目的ID。
简单的应用程序列出所有项目,添加新的,删除和编辑。 我怎样才能在MVVWM中做到这一点?
UPDATE
我只是想创build一个简单的应用程序,左边有菜单:
- 名单
- 添新。
点击列表时,显示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
对象的信息。