2013-05-07 59 views
0

我有一個動態加載xaml的子窗口,現在我想做一些綁定以便在子窗口和父窗口之間傳遞消息。因爲這個項目是基於插件的,所以對於只負責加載插件並幫助他們進行通信的shell來說,確定xaml中的控件是不可能的,因此在後面的代碼中操作它們是不明智的。Silverlight:動態加載和綁定Xaml

我已經實現了一個AppDataStore類來激發整個應用程序的消息傳遞。

AppDataStore.Values["SomeKey"] = "SomeObject"; 

就這樣我不知道是否有可能綁定動態加載到視圖模型,因此在二傳手,我可以使用AppDataStore的消息控件。此外,如果我能以這種方式實施一些驗證,那將是完美的。

你可能想知道爲什麼我試圖在我甚至不知道控件是什麼的情況下綁定控件。爲了回答這個問題,我認爲如果我指定要在控件的「Tag」屬性中綁定的屬性,則可以遍歷可視化樹並使用Reflection獲取屬性值。

無論如何,以上只是我的一些想法,直到現在,我一直堅持在這一點上很長時間。如果您知道如何實施它,或者您有更好的解決方案,請告訴我。提前致謝!

回答

0

你可以按照事件聚合/調解模式

我有一個基於插件的項目,但插件必須以是「可插拔」的共同參考框架DLL。這是確保通信組件可以通過插件和shell應用程序實現的最佳方法之一。

在您共同框架庫:

public class Mediator : IMediator // The interface would just specify the methods below 
{ 
    private List<object> _subscribers = new List<object>(); 

    public void Subscribe(object subscriber) 
    { 
     _subscribers.Add(subscriber); 
    } 

    public void Unsubscribe(object subscriber) 
    { 
     _subscribers.Remove(subscriber);    
    } 

    public void Publish(object payload) 
    { 
     // Loop through all subscribers and see if they implement the interface 
     // and that the param types match the passed in payload type 
     // if so - call ReceiveMessage with the payload 
    } 
} 

訂戶將使用

public interface ISubscribe<T> 
{ 
    void ReceiveMessage(T payload); 
} 

然後你只需要通過周圍調解作爲依賴的接口

public class SomeViewModel, ISubscribe<SomeMessageType> 
{ 
    public SomeViewModel(IMediator mediator) 
    { 
     mediator.Subscribe(this); 
    } 

    public ReceiveMessage(SomeMessageType payload) 
    { 
     // Do stuff with payload    
    } 
} 

SomeMessageType可以是任何類型

這樣,你的messager是一個插件可以依賴的獨立組件,但是所有組件都知道如何在不需要了解shell的情況下彼此交談。

他們只是呼籲Publish的調解員,他們要發送的消息類型:

mediator.Publish(new MyMessageType("Hello")); 
+0

謝謝您的回答。其實我在我的項目中使用MEF和CM。所以消息傳遞並不是一個很大的問題。問題在於,很難在代碼中調用消息傳遞,因爲xaml(動態控件)是易失性的 - 儘管它是我指定的,我不希望代碼依賴於因爲整個實現構建在MVVM上。 – 2013-05-07 14:04:16

+0

那麼爲什麼要使用代碼隱藏 - 爲什麼不只是從視圖模型調用消息?你有沒有麻煩佈線從視圖 - > viewmodel的控制? – Charleh 2013-05-07 14:08:29

+0

是的。因爲動態加載的xaml控件可能是一個TextBox或一個CheckBox或什麼的,所以將這個值綁定到ViewModel並不容易。我希望我可以將它們全部綁定到字典,但不知道它是否可行。 – 2013-05-07 14:39:10