从View中的事件处理程序获取对象到ViewModel中的事件处理程序

本文关键字:程序 事件处理 ViewModel 取对象 获取 View | 更新日期: 2023-09-27 18:02:19

下面是我在view . example .cs中创建对象的代码

视图

void pmi_Click(object sender, RoutedEventArgs e)
{
    MenuItem mi = sender as MenuItem;
    int projectKey = 0;
    projectKey = (int)mi.Tag;
    Project_VM project;
    foreach (var p in GlobalVars._instance.ProjectList)
    {
        if (projectKey == p.ClarityId)
        {
            project = new Project_VM(p.Model);
            Main winMain = Window.GetWindow(this.VisualParent) as Main;
            winMain.Projects.SelectedItem = project;
            winMain.Projects.ScrollIntoView(project);
        }
    }
}

我需要找出一种方法来获得该对象的事件处理程序在ViewModel是订阅使用委托的事件。

视图模型

void _selectedProject_ChangerSelectedProj(object o, SelectionProjEventArgs e)
{
    foreach (var p in _globalVars.ProjectList)
    {
        if (p.ClarityId.Equals(e.projectKey))
            changeSelectedProject(p);
    }
}

所以,而不是循环通过ProjectList,我想传递在view . example .cs中创建的项目对象。我正在更新和重构一个旧的WPF应用程序,我对它非常陌生。有什么建议吗?

从View中的事件处理程序获取对象到ViewModel中的事件处理程序

ViewModel在数据上下文中,只需将VM从它中去掉并将对象添加到它中。

var myVM = DataContext as MyViewModel ;
if (myVM != null)
  myVM.TargetEventHandler ....

我觉得最好把它从你的代码后面拿出来,把它放在视图模型的一个函数中,在你的对象点击时触发。我不确定pmi是参考功能声明pmi_click...,但如果它是一个按钮,命令属性可以绑定到位于视图模型中的公共RelayCommand属性。在视图模型构造函数中,将RelayCommand属性设置为函数的属性。然后,该函数的内容可以完成与后面代码中的click函数中相同的操作。然后,您就可以访问视图模型中的所有对象。