首先,如果这很简单,我必须道歉。我是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对象。
任何帮助/建议将不胜感激。谢谢
查看事件聚合。您的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] 删除。
我来说两句