gpt4 book ai didi

wpf - 我可以从其他子窗口 ViewModel 访问主窗口 ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:31:49 33 4
gpt4 key购买 nike

首先,如果这很简单,我必须道歉。我对 WPF 和 MVVM 非常陌生,我想确保我没有违反任何 WPF 或 MVVM 概念。此外,对于下面的冗长解释(试图提供所有细节):

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

这用于其他传统的 Windows 窗体应用程序。我现在正在创建一个新的桌面 WPF 应用程序(早期阶段),我必须使用相同的程序集。

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

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

_abcViewModel 使用程序集的逻辑,可以使用传统的委托(delegate)和事件处理程序检索一些消息。

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

我从另一个 stackoverflow 帖子 (: How to access WPF MainWindow Controls from my own .cs file ) 中发现,您可以通过以下方式访问主窗口对象:
((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 对象。

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

最佳答案

查看事件聚合。您的 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
}
}

关于wpf - 我可以从其他子窗口 ViewModel 访问主窗口 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57063471/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com