gpt4 book ai didi

c# - Caliburn Micro-在ViewModels之间共享数据

转载 作者:行者123 更新时间:2023-12-03 10:35:19 26 4
gpt4 key购买 nike

从Caliburn Micro“简单MDI”示例开始。我想实现以下目标:

我想在ViewModels之间共享类的引用。 shareme.count应该作为对所有ViewModel的引用传递。这将允许我从每个ViewModel中进行更改。

如何才能达到接近Caliburn Micro惯例的水平?

ShellViewModel.cs

public class ShellViewModel : Conductor<IScreen>.Collection.OneActive {

SharedClass _shareme;

public SharedClass shareme {
get { return _shareme; }
set {
_shareme = value;
NotifyOfPropertyChange(() => shareme);
}
}

public ShellViewModel() {
shareme.count = 1;
}

public void OpenTab() {
ActivateItem(new TabViewModel {
DisplayName = "Tab " + shareme.count++
});
}

TabViewModel.cs
public class TabViewModel : Screen {}

AppBootstrapper.cs
    public class AppBootstrapper : BootstrapperBase {
SimpleContainer container;

public AppBootstrapper() {
Initialize();
}

protected override void Configure() {

container = new SimpleContainer();

container.Singleton<IWindowManager, WindowManager>();
container.Singleton<IEventAggregator, EventAggregator>();
container.PerRequest<IShell, ShellViewModel>();
}

protected override object GetInstance(Type service, string key) {
var instance = container.GetInstance(service, key);
if (instance != null)
return instance;

throw new InvalidOperationException("Could not locate any instances.");
}

protected override IEnumerable<object> GetAllInstances(Type service) {
return container.GetAllInstances(service);
}

protected override void BuildUp(object instance) {
container.BuildUp(instance);
}

protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
{
DisplayRootViewFor<IShell>();
}
}

最佳答案

还将用作您重复问题的答案。

EventAggregator不仅用于“事件”,您还可以将消息传递数据到正在监听消息或事件签名的任何或所有 View 模型。

public class ViewModelA : Screen, IHandle<ShareMeMessageA>
{
private readonly IEventAggregator _events;
private int _sharemecount;
public class ViewModelA(IEventAggregator events){

_events = events;
_events.Subscribe(this);
}

//... other bits out for brevity
//-- EDIT --
public void SomeEventClick(){
_event.PublishOnUiThread(new ShareMeMessageB(){ ... etc ... });
}

protected override void Deactivated(bool close){
_events.Unsubscribe(this);
}

private void Handle(ShareMeMessageA msg)
{
if(msg != null)
sharemecount = msg.Count;
}
}

因为这只是一个示例,所以您根本不需要传递类对象,您可以传递想要的 bool ,整数,浮点数等任何类型。

关于c# - Caliburn Micro-在ViewModels之间共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32503044/

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