【问题标题】:Caliburn micro ViewModel is not picking up a message from another ViewModelCaliburn micro ViewModel 没有从另一个 ViewModel 接收消息
【发布时间】:2013-09-24 06:19:44
【问题描述】:

在我使用 Caliburn.micro 框架学习 MVVM 之后...我正在尝试像这样通过 EventAggregator 发送数据的两个 viewModel 通信(代码“没有意义”,仅用于测试):

MainWindowViewModel.cs

namespace TOP
{
[Export(typeof(MainWindowViewModel))]
public class MainWindowViewModel : Conductor<IScreen>.Collection.OneActive
{
    readonly IWindowManager windowManager;
    private readonly IEventAggregator events;
    private bool _Logged;

    [ImportingConstructor]
    public MainWindowViewModel(IWindowManager windowManager, IEventAggregator events)
    {
        DisplayName = "TOP";
        this.events = events;
        events.Subscribe(this);
        this.windowManager = windowManager;
        windowManager.ShowDialog(new LoginViewModel(events));

    }

    public bool Logged
    {
        get { return _Logged; }
        set
        {
            _Logged = value;
            if(_Logged== true) 
                InitiateApp();
        }
    }

    public void Handle(LoginEvent message)
    {
        Logged = message.Logged;
    }

    private void InitiateApp() {
        ActivateItem(new TwoWindowViewModel());
        }
    }
}

LoginViewModel.cs

namespace TOP{ 

 [Export(typeof(IScreen))]
    public class LoginViewModel : Screen
    {
        private readonly IEventAggregator _events;

        [ImportingConstructor]
        public LoginViewModel(IEventAggregator events)
        {

           DisplayName = "Login";
           _events = events;
           Login();
        }


       public void Login()
       {
           _events.Publish(new LoginEvent(true));
       }
    }
}

LoginEvent.cs

    namespace TOP
    {
        public class LoginEvent
        {
           public LoginEvent(bool logged) 
           {
               Logged = logged;
           }

         public bool Logged { get; private set; }
    }
}

为什么 MainWindowViewModel 的 Handle 方法没有从 LoginViewModel 获取已发布的消息?

感谢您的回复。

【问题讨论】:

    标签: c# mvvm caliburn.micro


    【解决方案1】:

    您的MainWindowViewModel 需要实现IHandle&lt;LoginEvent&gt;。您已经使用正确的签名定义了方法,因此您只缺少实际告诉编译器您实现接口的部分:

    public class MainWindowViewModel
        : Conductor<IScreen>.Collection.OneActive, IHandle<LoginEvent>
    

    更多信息可以在the documentation找到。

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 2013-06-26
      • 2020-10-24
      相关资源
      最近更新 更多