【发布时间】:2020-01-05 10:18:28
【问题描述】:
我正在使用Caliburn.Micro 学习和尝试MVVM。我有一个主要的ShellViewModel 和一个子用户控件Module1ViewModel。我正在尝试使用IEventAggregator 实现他们之间的通信。
现在,我可以从子控件 ShellViewModel 更改 ShellViewModel (它是父级)的属性,并且可以从父级更改子控件的属性并且它可以工作。
问题:我面临的问题是,当我在两个 ViewModel 中启用 events.Subscribe(this); 时,我得到一个异常。
我想要实现的是两种方式的沟通方式。这意味着我想从子项更改父项的某些属性,同时我应该能够从父项更改子项的某些属性。以下是我的代码,请检查这里有什么问题。
子用户控制模块1ViewModel
namespace IntelliCoreMVVM.ViewModels
{
public class Module1ViewModel:Screen , IHandle<string>
{
private IEventAggregator _events;
public Module1ViewModel(IEventAggregator events)
{
_events = events;
events.Subscribe(this);
}
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
NotifyOfPropertyChange(()=>FirstName);
_events.PublishOnUIThread(FirstName);
}
}
public void Handle(string message)
{
FirstName = message;
}
}
}
如您所见,我正在发布和处理一个属性。
ShellViewModel
public class ShellViewModel : Conductor<object> , IHandle<string>
{
private Module1ViewModel _module1ViewModel;
private IEventAggregator _events;
public ShellViewModel(Module1ViewModel module1ViewModel,IEventAggregator events)
{
_events = events;
events.Subscribe(this);
_module1ViewModel = module1ViewModel;
}
private string _test;
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
NotifyOfPropertyChange(()=>FirstName);
_events.PublishOnUIThread(new CustomerModel{FirstName = FirstName});
}
}
public string Test
{
get { return _test; }
set
{
_test = value;
NotifyOfPropertyChange(()=>Test);
}
}
public void Handle(string message)
{
Test = message;
}
}
【问题讨论】:
-
@mjwills StackTrace 在异常详细信息的快速观察窗口中为空...??在 Visual Studio 的调用堆栈窗口中,它是一个巨大的列表……我该如何分享呢?
-
@mjwills 附上两张截图,请查收。
-
“两种方式的交流”?那么什么时候应该停止这种交流呢?应该有一个事件的发布者。它可以由多个订阅者处理。但是,如果订阅者每次收到事件时都向发布者发布另一个事件,则发布者无法通过向订阅者发送另一个事件来响应此事件。难怪你会收到
StackoverflowException。你想在这里完成什么? -
当然他们可以,但他们不能通过在另一个方向发送相同的事件来响应对方的事件,因为它会得到新的事件,并且链会像这样继续下去,直到你用完堆栈空间。
-
Module1ViewModel正在处理 所有string事件,包括它自己的事件。
标签: c# wpf mvvm caliburn.micro