2012-11-28 410 views
0

後面的視圖代碼訂閱onpropertychanged事件我正在研究一個具有文件查看器的silverlight項目。該文件查看器沒有Source屬性或其他接受流的屬性。它有一個LoadDocument(Stream文件)方法。由於該文件將被異步加載,因此我需要「通知」緩衝區可用的視圖,然後讓View調用LoadDocument方法。Caliburn Micro從

在MVVMLight中,我可以使用「Messenger」功能執行此操作。我看到了EventAggregator,但是我看到的所有事情都是以另一種方式進行的。我覺得這應該很容易做,但我只是看不到它。

在視圖構造函數中是否有方法將方法綁定到ViewModel的屬性?這似乎是這是在xaml中完成的功能,我只是想在後面的代碼中完成它。

感謝

DBL

回答

0

不通過後確定,但它聽起來就像你想在你的看法

在這種情況下,從控制的方法的事件綁定:

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

如果是另一種方式,您可以使用事件聚合器(視圖可以訂閱事件......爲什麼不呢,它仍然是分離的......)

VM:

SomeEventAggregator.Publish(new SomeMessageInstanceThatTheViewWillSubscribeTo()); 

檢視:

class SomeView : UserControl, IHandle<SomeMessageInstanceThatTheViewWillSubscribeTo> 

// dont forget to... 
SomeEventAggregator.Subscribe(this); 

可選地 - 在視圖上實現接口

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

VM:

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的多少以及所有事情是如何分離的。

+0

謝謝,結束了我處理它有點不同。我subclassed控制並添加一個依賴屬性屬性在該控件上,並在我的表單上使用。在屬性改變的事件中,我調用了需要調用的基本方法。在這種情況下,這是一個更優雅的解決方案。但謝謝你的答案。 – dblwizard