在视图模型之间传递参数

Chr*_*ris 1 wpf mvvm

在我的应用程序中,我有2个视图.列表(GridView)和表单.我正在改变这个线程中提出的视图: WPF MVVM切换用户控件

现在我有一个问题,如何在单击编辑后传递所选项目的ID以显示带有编辑表单的新视图.

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


UPDATE

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

  1. 名单
  2. 添新.

单击列表时,它会显示带有列表和3个按钮的UC:添加,编辑,删除.点击添加后,编辑它会显示带有特定值的表格的UC(编辑时).我怎么能实现这个?

Joa*_*Fdz 11

据我了解,你想要这样的东西:

主屏幕显示列表 因此,当您单击时Add,它显示: 主屏幕显示添加表单

对?

所以你需要以下行为:

  • 添加不需要任何ID.
  • 列表必须在添加完成后重新加载.
  • 编辑接收列表的选定项目ID.
  • 列表必须在添加完成后重新加载.

我将假设您正在使用某个存储库.

我提出以下MVVM结构:

  • MainViewModel:主屏幕的DataContext.
    • BaseViewModel RightViewModel:视图模型的容器显示在屏幕的右侧.
    • ICommand ViewListCommand:通过创建新实例ListViewModel并将其分配给BaseViewModel属性来显示列表.
    • ICommand AddNewCommand:通过创建新的isntance AddViewModel并将其分配给BaseViewModel属性来显示addnew屏幕.

然后:

  • ListViewModel:单击列表时屏幕右侧的DataContext.
    • List<Items> Items:提供要显示的项目.
    • Item SelectedItem:将绑定到UI上的SelectedItem的属性.
    • ICommand EditCommand:将获取所选项目并通知必须编辑的MainViewModel的命令.

因此,在某些时候,viewmodel将从子视图模型接收通知(即列表将告诉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;
    }

}
Run Code Online (Sandbox Code Playgroud)

xaml绑定不是必需的,因为它会非常前进.

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

对于这种东西,您还可以查看Reactive UI.


She*_*dan 10

如果您具有视图模型的公共父级,则可以使用该父级为您传递参数值.只需delegate在相关视图模型中设置一个或多个s:

在具有要更新的相关参数的视图模型中......让我们调用它ParameterViewModel:

public delegate void ParameterChange(string parameter);

public ParameterChange OnParameterChange { get; set; }
Run Code Online (Sandbox Code Playgroud)

在父母:

ParameterViewModel viewModel = new ParameterViewModel();
viewModel.OnParameterChange += ParameterViewModel_OnParameterChange;
ListMenu.Add(viewModel);
// Add other view models
Run Code Online (Sandbox Code Playgroud)

返回ParameterViewModel参数更改时:

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

现在在父视图模型中:

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

您可以在MSDN上delegateDelegates(C#编程指南)页面中找到有关使用对象的更多信息.

  • 这就是为什么您应该将所有这些(新)信息放入您的问题而不是在用户花时间回答您的原始问题后的评论中. (3认同)