【问题标题】:Caliburn Micro subscribe to onpropertychanged event from view code behindCaliburn Micro 从后面的代码中订阅 onpropertychanged 事件
【发布时间】:2012-11-28 23:46:32
【问题描述】:

我正在开发一个带有文件查看器的 silverlight 项目。此文件查看器没有 Source 属性或其他接受流的属性。它确实有一个 LoadDocument(Stream file) 方法。由于文件将被异步加载,我需要“通知”视图缓冲区可用,然后让视图调用 LoadDocument 方法。

在 MVVMLight 中,我可以使用“Messenger”功能来做到这一点。我看到了 EventAggregator,但我看到的所有东西的通信都以另一种方式进行。我觉得这应该很容易做到,但我只是不明白。

Views 构造函数中是否可以将方法绑定到 ViewModel 的属性?这似乎与在 xaml 中完成的功能相同,我只想在后面的代码中完成。

谢谢

dbl

【问题讨论】:

    标签: silverlight mvvm caliburn.micro


    【解决方案1】:

    帖子不确定,但听起来您想将控件中的事件绑定到视图上的方法

    在这种情况下:

    <SomeControl cal:Message.Attach="[Event SomeEvent] = [Action SomeMethod($eventArgs)]" />
    

    如果反过来,您可以使用事件聚合器(视图可以订阅事件……为什么不呢,它仍然是解耦的……)

    虚拟机:

    SomeEventAggregator.Publish(new SomeMessageInstanceThatTheViewWillSubscribeTo());
    

    查看:

    class SomeView : UserControl, IHandle<SomeMessageInstanceThatTheViewWillSubscribeTo>
    
    // dont forget to...
    SomeEventAggregator.Subscribe(this);
    

    或者 - 在视图上实现一个接口

    class SomeView : UserControl, IAcceptSomeNotificationMessage
    {
        public void Notify() { // blah
        }
    }
    

    虚拟机:

    class SomeViewModel : Screen // whatever 
    {
        void SomeMethod() 
        {
            // The VM should be IViewAware so will implement GetView()
            var view = GetView();
    
            if(view is IAcceptSomeNotificationMessage)
                (view as IAcceptSomeNotificationMessage).Notify();
        }
    }
    

    选择上述方法之一 - 我相信还有更多方法。我通常使用事件聚合器 - 当然这取决于您使用多少 IoC 以及所有内容的解耦程度。

    【讨论】:

    • 谢谢,最后我的处理方式有所不同。我对控件进行了子类化,并在该控件上添加了一个 Dependency 属性,并在我的表单上使用了它。然后在属性更改事件中,我调用了需要调用的基本方法。在这种情况下,这是一个更优雅的解决方案。但感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多