Caliburn.Micro视图没有在Popup中被破坏

时间:2014-12-10 21:47:57

标签: c# wpf caliburn.micro

当我关闭使用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

1 个答案:

答案 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);
    }