gpt4 book ai didi

c# - 使用 IEventAggregator 的 Caliburn Micro Stack 溢出异常

转载 作者:行者123 更新时间:2023-12-03 11:01:56 26 4
gpt4 key购买 nike

我正在学习和尝试MVVM使用 Caliburn.Micro .我有一个主要的ShellViewModel和一个子用户控件 Module1ViewModel .我正在尝试使用 IEventAggregator 实现他们之间的通信.
现在,我可以更改 ShellViewModel 的属性(它是父级)来自子控件 ShellViewModel 并且可以从父级更改子控件的属性并且它可以工作。

问题:我面临的问题是,当我启用 events.Subscribe(this);在两个 ViewModel 中我都遇到了异常。
enter image description here

我想要达到的是两种方式 种交流。这意味着我想同时从子项更改父项的某些属性,同时我应该能够从父项更改子项的某些属性。以下是我的代码,请检查这里有什么问题。

子用户控制模块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;
}
}


快速观看
enter image description here
堆栈调用
enter image description here

最佳答案

FirstName引发调用 Handle 的事件设置FirstName然后它会像这样在无限循环中继续下去,直到你用完堆栈空间并获得 StackOverflowException .

问题是 Module1ViewModel处理所有 string事件,包括它自己引发的事件。

您可能想要做的是定义不同类型的事件,以便您可以区分它们并选择要处理的事件。在以下示例中,Module1ViewModel处理 ParentToChildEvent 类型的事件但它会引发 ChildToParentEvent 类型的事件. ShellViewModel应该做相反的事情。

public class Module1ViewModel : Screen, IHandle<ParentToChildEvent>
{
private IEventAggregator _events;
public Module1ViewModel(IEventAggregator events)
{
_events = events;
events.Subscribe(this);
}
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
_events.PublishOnUIThread(new ChildToParentEvent(FirstName));
}
}

public void Handle(string message)
{
FirstName = message;
}
}

关于c# - 使用 IEventAggregator 的 Caliburn Micro Stack 溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57755902/

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