从子视图调用方法

时间:2017-11-14 08:38:47

标签: c# wpf mvvm caliburn

我试图对同事所做的代码进行一些更改。

因此,我有一个ShellView,它使用在其ViewModel中定义的方法加载文档(并将其显示为其内容),以及子视图,一个StatusBarView,它保存在文档和其他一些信息中导航的路径。

public class ShellViewModel 
{
    public StatusBarViewModel StatusBar { get; }

    public ShellViewModel(StatusBarViewModel statusBarViewModel, ...)
    {
        StatusBar = statusBarViewModel;

        var keymap = new Keymap();
        keymap.Map("F2", new SimpleCommand("open-file", 
                                           "Shows the open file dialog", 
                                            param => OpenFile());

    }

    private void OpenFile()
    {
        // Logic to open the file that uses other methods 
        // inside this VM to validate the file
    }
}

目前你可以按一个键加载一包新文件,我想用状态栏中的一个按钮做同样的事情并调用该方法。

从子视图调用父视图中存在的方法的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

有很多方法。首先需要分析你的目的。 - 您可以在子视图中创建ActionEvent或EventHandler,单击按钮可以引发该事件。 - 另一种使用方式可以使用Mediator模式/观察者模式

实施例: 内部子ViewModel:

public event EventHandler openFileEvent;

状态栏上的内部点击按钮操作:

private void btnClick()
{
  if(null != openFileEvent)
  {
     openFileEvent(this, new EventArgs{});
  }
}

内部父ViewModel:

statusBarViewModel.openFileEvent += new EventHandler(EventHandlerName);

private void EventHandlerName(objehct sender, EventArgs...)
{
   ...
   OpenFile();
   ...
}

答案 1 :(得分:0)

在子视图中定义事件处理程序

public EventHandler OpenFileHandler

点击状态栏视图的按钮,执行以下操作:

public Btn_Click(object sender, RoutedEventArgs e)
 {
   OpenFileHandler(this, e);
 }
在父视图中

,在创建状态栏视图时,定义委托

statusbar.OpenFileHandler+= delegate
{ 
   ShellViewModel instance = this.DataContext as ShellViewModel;
   instance.OpenFile();
}

状态栏是我给你的状态栏视图的名称,但它代表了它的实例