从其他窗口的视图模型调用窗口中的函数

时间:2019-12-11 05:43:21

标签: c# wpf

因此,我目前有2个窗口(MainWindow,SubWindow)和一个视图模型。 MainWindow主要只是使用hardcodet.wpf.taskbarnotification.taskbaricon的任务栏图标。单击此任务栏图标的上下文菜单中的按钮,将打开SubWindow。

将SubWindow的DataContext设置为视图模型。 SubWindow允许用户输入一堆数据并单击“上传”按钮,这会将所有数据发送到我之前编写的服务中。该服务将对数据做很多事情,并返回一个字符串。我目前的目标是获取此返回的字符串并在MainWindow中使用它,但这是我的问题所在。

对该服务的调用是在ViewModel中完成的,我不确定如何将响应返回到MainWindow。我最初的想法是仅对其他对象中的每个对象进行引用(即,对SubWindow中的MainWindow和ViewModel中的SubWindow的引用),但是我宁愿避免这样做。我也考虑过事件,但是我无法弄清楚如何使事件在ViewModel和MainWindow之间工作。

对于我应该如何进行活动或我应该做些什么的任何帮助/建议,将不胜感激。如果需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

  

使用MVVM Light Messenger

> http://dotnetpattern.com/mvvm-light-messenger
public class ViewModelA : ViewModelBase
{
    public void SearchCommandMethod()
    {
        MessengerInstance.Send<NotificationMessage>(new NotificationMessage("notification message"));
    }
}

Jesse Liberty of Microsoft has a great concrete walk through on how to make use of the messaging within MVVM Light. The premise is to create a class which will act as your message type, subscribe, then publish.

public class GoToPageMessage
{
   public string PageName { get; set; }
}
This will essentially send the message based on the above type/class...

    private object GoToPage2()
    {
       var msg = new GoToPageMessage() { PageName = "Page2" };
       Messenger.Default.Send<GoToPageMessage>( msg );
       return null;
    }

Now you can register for the given message type, which is the same class defined above and provide the method which will get called when the message is received, in this instance ReceiveMessage.

    Messenger.Default.Register<GoToPageMessage>
    ( 
         this, 
         ( action ) => ReceiveMessage( action ) 
    );

    private object ReceiveMessage( GoToPageMessage action )
    {
       StringBuilder sb = new StringBuilder( "/Views/" );
       sb.Append( action.PageName );
       sb.Append( ".xaml" );
       NavigationService.Navigate( 
          new System.Uri( sb.ToString(), 
                System.UriKind.Relative ) );
       return null;
    }

答案 1 :(得分:0)

您是否尝试过将委托(函数回调)从主窗口视图模型传递到子窗口?因此,子窗口可以调用此方法以将结果传递回主窗体。