当我关闭使用Caliburn micro创建的弹出窗口时,我遇到了一个问题:视图似乎没有被破坏。
我使用带有MEF的Caliburn.Micro 2.0.1,你可以在这里看到我的例子: https://github.com/louisfish/BaseCaliburn
基本上,我创建了一个里面有一个按钮的窗口。 单击此按钮时,将使用WindowManager的ShowWindow功能打开一个新窗口。 在这个弹出窗口中,我创建了一个带绑定的消息。 当我的消息进入我的ViewModel时,我输出了输出跟踪。
using Caliburn.Micro;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BaseCaliburn.ViewModels
{
[Export]
public class PopupViewModel : Screen
{
private int _timesOpened;
private string _message;
public string Message
{
get
{
Debug.WriteLine("Message is get");
return _message;
}
set
{
if (value == _message) return;
_message = value;
NotifyOfPropertyChange(() => Message);
}
}
protected override void OnActivate()
{
Debug.WriteLine("---Window is activated---");
_timesOpened++;
Message = "Popup number : " + _timesOpened;
}
}
}
每次打开和关闭窗口时,旧的绑定都会停留在那里。 所以在5次打开/关闭之后,我在我的ViewModel中调用了我的get消息。
所以我收到旧观点的绑定:
Message is get
---Window is activated---
Message is get
Message is get
Message is get
Message is get
Message is get
答案 0 :(得分:1)
HomeViewModel
个实例。您将主窗口绑定到HomeViewModel
,因此每次单击StartApp
时,都会在同一实例上调用该方法。PopupViewModel
属性,只要创建HomeViewModel
,就会由依赖项注入容器初始化该属性。然后,它保持不变。每次StartApp
方法获取属性的值时,都会返回PopupViewModel
的相同实例。每次拨打PopupViewModel
时,您实际需要的是一个新的StartApp
个实例。你需要一个工厂。在MEF中,您可以导入ExportFactory<T>
以按需创建实例:
[Import]
public ExportFactory<PopupViewModel> PopupViewModelFactory { get; set; }
public void StartApp()
{
Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
PopupViewModel newPopup = this.PopupViewModelFactory.CreateExport().Value;
IoC.Get<IWindowManager>().ShowWindow(newPopup);
}