2013-05-07 73 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