Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在视图模型之间传递参数_Wpf_Mvvm - Fatal编程技术网

Wpf 在视图模型之间传递参数

Wpf 在视图模型之间传递参数,wpf,mvvm,Wpf,Mvvm,在我的应用程序中,我有两个视图。列表(GridView)和表单。我正在改变本帖中提出的观点: 现在我遇到了一个问题,在单击“编辑”以使用编辑表单显示新视图后,如何传递所选项目的id 简单的应用程序,列出所有项目,添加新的,删除和编辑。如何在MVVWM中执行此操作? 更新 我只想创建一个简单的应用程序,它的左边有一个菜单: 名单 添加新的 单击列表时,将显示UC,其中包含列表和3个按钮:添加、编辑、删除。单击“添加”后,“编辑”将显示带有特定值表单的UC(编辑时)。如何实现这一点???如果视图

在我的应用程序中,我有两个视图。列表(GridView)和表单。我正在改变本帖中提出的观点:

现在我遇到了一个问题,在单击“编辑”以使用编辑表单显示新视图后,如何传递所选项目的id

简单的应用程序,列出所有项目,添加新的,删除和编辑。如何在MVVWM中执行此操作?
更新


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

  • 名单
  • 添加新的
    单击列表时,将显示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
    • 列表必须在添加完成后重新加载
    我假设您正在使用某个存储库

    我建议采用以下MVVM结构:

    • MainViewModel
      :主屏幕的数据上下文。
      • BaseViewModel RightViewModel
        :屏幕右侧显示的视图模型容器
      • ICommand ViewListCommand
        :通过创建
        ListViewModel
        的新实例并将其分配给
        BaseViewModel
        属性来显示列表
      • ICommand AddNewCommand
        :通过创建
        AddViewModel
        的新显示并将其分配给
        BaseViewModel
        属性来显示addnew屏幕
    然后:

    • ListViewModel
      :单击列表时屏幕右侧的数据上下文。
      • 列出项目
        :提供要显示的项目
      • 项SelectedItem
        :将绑定到UI上SelectedItem的属性
      • ICommand EditCommand
        :获取所选项目并通知必须编辑的MainViewModel的命令
    因此,在某个时刻,viewmodel将收到来自子viewmodel的通知(即,list将告诉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;
        }
    
    }
    
    公共类项目
    {
    公共字符串名称{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(编辑时)。我如何才能做到这一点?这就是为什么在用户花时间回答您的原始问题后,您应该将所有这些(新)信息放在您的问题中,而不是放在评论中。优雅的解决方案,我也会这么做。