在我的应用中,我有2个观点。列表(GridView)和表单。我正在改变这个帖子中提出的观点: WPF MVVM switch usercontrols
现在我遇到一个问题,如何在单击编辑后传递所选项目的ID以显示带有编辑表单的新视图。
简单的应用程序列出所有项目,添加新项目,删除和编辑。我怎样才能在MVVWM中做到这一点?
<小时/> 更新
我只想创建一个简单的应用程序,左边的菜单包含:
单击列表时,会显示带列表的UC和3个按钮:添加,编辑,删除。点击添加后,编辑它会显示带有特定值的表格的UC(编辑时)。我怎么能实现这个?
答案 0 :(得分:11)
据我了解,你想要这样的东西:
因此,当您点击Add
时,它会显示以下内容:
右?
所以你需要以下行为:
我将假设您正在使用某个存储库。
我提出以下MVVM结构:
MainViewModel
:主屏幕的DataContext。
BaseViewModel RightViewModel
:屏幕右侧显示的视图模型容器。ICommand ViewListCommand
:通过创建ListViewModel
的新实例并将其分配给BaseViewModel
属性来显示列表。ICommand AddNewCommand
:通过创建AddViewModel
的新isntance并将其分配给BaseViewModel
属性来显示addnew屏幕。然后:
ListViewModel
:单击“列表”时屏幕右侧的DataContext。
List<Items> Items
:提供要显示的项目。Item SelectedItem
:将绑定到UI上SelectedItem的属性。ICommand EditCommand
:将获取所选项目并通知必须编辑的MainViewModel的命令。因此,在某些时候,视图模型将从子视图模型接收通知(即列表将告诉main编辑某些东西)。我建议使用以下事件来执行此操作:
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。
答案 1 :(得分:10)
如果您拥有视图模型的公共父级,则可以使用该父级为您传递参数值。只需在相关视图模型中设置一个或多个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上的Delegates (C# Programming Guide)页面上找到有关使用delegate
个对象的详情。