Wpf 在视图模型之间传递参数
在我的应用程序中,我有两个视图。列表(GridView)和表单。我正在改变本帖中提出的观点: 现在我遇到了一个问题,在单击“编辑”以使用编辑表单显示新视图后,如何传递所选项目的id 简单的应用程序,列出所有项目,添加新的,删除和编辑。如何在MVVWM中执行此操作?Wpf 在视图模型之间传递参数,wpf,mvvm,Wpf,Mvvm,在我的应用程序中,我有两个视图。列表(GridView)和表单。我正在改变本帖中提出的观点: 现在我遇到了一个问题,在单击“编辑”以使用编辑表单显示新视图后,如何传递所选项目的id 简单的应用程序,列出所有项目,添加新的,删除和编辑。如何在MVVWM中执行此操作? 更新 我只想创建一个简单的应用程序,它的左边有一个菜单: 名单 添加新的 单击列表时,将显示UC,其中包含列表和3个按钮:添加、编辑、删除。单击“添加”后,“编辑”将显示带有特定值表单的UC(编辑时)。如何实现这一点???如果视图
更新
我只想创建一个简单的应用程序,它的左边有一个菜单:
单击列表时,将显示UC,其中包含列表和3个按钮:添加、编辑、删除。单击“添加”后,“编辑”将显示带有特定值表单的UC(编辑时)。如何实现这一点???如果视图模型有一个公共父对象,则可以使用该父对象为您传递参数值。只需在相关视图模型中设置一个或多个
委托
s即可:
在视图模型中,使用要更新的相关参数。。。让我们称之为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上的页面上找到有关使用委托对象的更多信息。据我所知,您需要这样的内容: 因此,当您单击添加时,它会显示以下内容: 对吧? 因此,您需要以下行为:
- Add不需要任何ID
- 列表必须在添加完成后重新加载
- “编辑”将接收列表的选定项ID
- 列表必须在添加完成后重新加载
:主屏幕的数据上下文。MainViewModel
:屏幕右侧显示的视图模型容器BaseViewModel RightViewModel
:通过创建ICommand ViewListCommand
的新实例并将其分配给ListViewModel
属性来显示列表BaseViewModel
:通过创建ICommand AddNewCommand
的新显示并将其分配给AddViewModel
属性来显示addnew屏幕BaseViewModel
:单击列表时屏幕右侧的数据上下文。ListViewModel
:提供要显示的项目列出项目
:将绑定到UI上SelectedItem的属性项SelectedItem
:获取所选项目并通知必须编辑的MainViewModel的命令ICommand EditCommand
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;
}
}
公共类项目
{
公共字符串名称{get;set;}
}
公共类ItemEventArgs:EventArgs
{
公共项项{get;set;}
public ItemEventArgs(Item selectedItem)
{
this.Item=selectedItem;
}
}
公共类BaseViewModel
{
}
公共类ListViewModel:BaseViewModel
{
公共事件事件处理程序编辑项;
公共项SelectedItem{get;set;}
公共ICommand EditItemCommand{get;private set;}
公共ListViewModel()
{
this.EditItemCommand=new DelegateCommand(()=>this.EditItem(this,new ItemEventArgs(this.SelectedItem));
}
}
公共类EditViewModel:BaseViewModel
{
}
公共类主视图模型
{
public BaseViewModel RightViewModel{get;private set;}
公共ICommand ViewListCommand{get;private set;}
公共主视图模型()
{
this.ViewListCommand=新的DelegateCommand(()=>
{
//取消勾选以前可能发生的事件
var listViewModel=新listViewModel();
listViewModel.EditItem+=listViewModel\u EditItem;
this.RightViewModel=listViewModel;
});
}
void listViewModel_EditItem(对象发送方,ItemEventArgs e)
{
//取消勾选以前可能发生的事件
var editViewModel=新的editViewModel();
this.RightViewModel=editViewModel;
}
}
xaml绑定是不必要的,因为它将非常向前
这是一个非常基本的例子,关于我认为如何处理这类事情。这里最重要的是正确地解开事件挂钩,否则可能会遇到问题
对于这类内容,您也可以看一看。您的视图模型之间是否有一个共同的父视图?我有一个主窗口,其中包含其他视图模型的可观察集合,在窗口的右侧,我有:作为对您的评论的回应,我现在已添加到您的问题中,我强烈建议您编辑您的问题,并向我们展示您在本网站上所做的尝试。我只想创建一个简单的应用程序,它的左侧有一个菜单:1。清单2。添加新的。单击列表时,将显示UC,其中包含列表和3个按钮:添加、编辑、删除。单击“添加”后,“编辑”将显示带有特定值表单的UC(编辑时)。我如何才能做到这一点?这就是为什么在用户花时间回答您的原始问题后,您应该将所有这些(新)信息放在您的问题中,而不是放在评论中。优雅的解决方案,我也会这么做。