我可以从其他子窗口ViewModel访问主Window ViewModel吗?

乔伊

首先,如果这很简单,我必须道歉。我是WPF和MVVM的新手,我想确保自己没有违反任何WPF或MVVM概念。另外,对于以下冗长的解释(尝试提供所有详细信息):

我目前正在引用具有所有业务逻辑或服务层(服务类,实体类,数据操作等)的Assembly dll。

其他传统的Windows窗体应用程序中使用了此功能。我现在正在创建一个新的桌面WPF应用程序(早期),并且必须使用相同的程序集。

我创建了一个带有菜单,状态栏等的主窗口及其ViewModel(称为_mainViewModel)。

我创建了另一个具有自己的ViewModel对象的简单窗口(称为_abcViewModel)。Windows对象/控件在子视图中绑定良好。这很好用,到目前为止我对此很满意。

_abcViewModel使用了程序集中的逻辑,该逻辑可以使用传统的委托和事件处理程序来检索某些消息。

现在,我的意图是将来自那些事件的消息绑定到主窗口StatusBar对象,该对象绑定到_mainWindowViewModel.StatusBarItemMessage。我怎样才能做到这一点?

我从另一个stackoverflow帖子(:如何从我自己的.cs文件访问WPF MainWindow控件)中发现,您可以使用类似((MainWindow)System.Windows.Application.Current.MainWindow)._ mainWindowViewModel的内容来访问主窗口对象。 StatusBarMessage = args.Message;

我在_abcViewModel中订阅了这些DLL事件处理程序:

    private void SubscribeBusinessLogicEvents()
    {
        _SPPIDDrawingWPFService.PidToolBoxInfoEvent += new SPPIDDrawingWPFService.PidToolBoxInfoEventHandler(PidToolBoxInfoEvent);
        _SPPIDDrawingWPFService.PidToolBoxErrorEvent += new SPPIDDrawingWPFService.PidToolBoxErrorEventHandler(PidToolBoxErrorEvent);
    }


    private void UnsubscribeBusinessLogicEvents()
    {
        _SPPIDDrawingWPFService.PidToolBoxInfoEvent -= PidToolBoxInfoEvent;
        _SPPIDDrawingWPFService.PidToolBoxErrorEvent -= PidToolBoxErrorEvent;

    }


    internal void PidToolBoxErrorEvent(object sender, PidToolBoxEventArg args)
    {
        App.WriteLocalErrorLogFile(args);
    }


    internal void PidToolBoxInfoEvent(object sender, PidToolBoxEventArg args)
    {
        //Is this correct? Can I change Main Windows view model from here?
        ((MainWindow)System.Windows.Application.Current.MainWindow)._mainWindowViewModel.StatusBarItemMessage = args.Message;
        if (args.OptionalPopUpFlag)
        {
            //
        }
        App.WriteWoodEngSysToolBoxErrorLog(args);
    }

这是正确的方法吗?从其他ViewModel访问ViewModel是否打破了Model–view–viewmodel或MVVM的概念?

如何从子窗口执行的操作更新主窗口状态栏控件。我不想在所有窗口中都使用庞大的ViewModel对象。

任何帮助/建议将不胜感激。谢谢

迈克尔·G

查看事件聚合。您的MainWindowViewmodel应该订阅AbcViewModel广播的“事件”。这将使AbcViewModel与MainWindowViewModel分离。

Prism是实现此模式的库。该库可能无法满足您的需求,但是您可以轻松实现自己的系统。

您的用法可能类似于以下内容:

AbcViewModel.cs

 internal void PidToolBoxInfoEvent(object sender, PidToolBoxEventArg args)
 {
        _eventAggregator.GetEvent<PidToolBoxUpdateEvent>().Publish(args);

        App.WriteWoodEngSysToolBoxErrorLog(args);
  }

MainWindowViewModel.cs

public class MainWindowViewModel
{
    public MainWindowViewModel(IEventAggregator ea)
    {
        // You may need to subscribe on the UI thread. 
        // If so, use: Subscribe(..., ThreadOption.UIThread) 
        ea.GetEvent<PidToolBoxUpdateEvent>().Subscribe(UpdateStatusBar);
    }

    void UpdateStatusBar(PidToolBoxEventArg pidEventArgs)
    {
        //implement logic
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ViewModel类实现LifecycleObserver可以吗?

我可以在同伴对象内共享ViewModel吗?

我可以在其他窗口的主窗口中使用相同的连接吗?C# wpf mysql

如何从其他ViewModel访问数据?

将ViewModel放在代码背后是错误的吗?

手动清除Android ViewModel吗?

调用ViewModel实例会重置LiveData吗?

从UserControl访问窗口ViewModel

ViewModel是否支持嵌套模型?虚拟属性可以应用于viewModel吗?

可以从MVVM的ViewModel中请求数据吗?

我应该在ViewModel中包括LifecycleOwner吗?

我需要 ViewModel 来向数据库添加信息吗?

我可以将viewmodel工厂与hilt依赖项注入一起使用吗?

设置 Xamarin 命令时,我可以在 viewModel 类构造函数中执行此操作吗?

我可以在实体框架C#中将代码优先实体用作ViewModel吗?

我可以在ViewModel中使用嵌套的IEnumerable创建MVC网络网格吗?

我可以使用ViewModel将数据发送到服务器吗?

C# 我们可以在 ViewModel 中用具体类型实例化接口吗

我可以对一个片段使用两个viewmodel吗?

我可以使用界面在不同项目的ViewModel之间导航吗

UWP C#MVVM如何从其他页面访问ViewModel

MVVM Light中有两种ViewModel吗?

如果您的ViewModel是IDisposable,MVC会调用Dispose吗?

在MVVM中,ViewModel或Model应该实现INotifyPropertyChanged吗?

从ViewModel调用业务逻辑是一种好习惯吗

WPF MVVM:将不同的ViewModel绑定到每个TabItem吗?

从Knockout ViewModel进行jQuery DOM操作-使用bindingHandlers吗?

ViewModel 应该包含模型吗?(ASP.NET,实体框架)

作为实例属性的实例可以访问主实例的其他属性吗?