0

我有一个动态加载 xaml 的子窗口,现在我想做一些绑定,以便在子窗口和父窗口之间传递消息。由于该项目是基于插件的,而仅负责加载插件并帮助它们通信的 shell 无法确定 xaml 中有哪些控件,因此在代码中操作它们是不明智的。

我已经实现了一个 AppDataStore 类,它可以刺激整个应用程序中的消息传递。

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

因此我想知道是否可以将动态加载的控件绑定到视图模型,因此在设置器中我可以使用 AppDataStore 进行消息传递。此外,如果我能以这种方式实现一些验证,那将是完美的。

你可能会奇怪,在我什至不知道控件是什么的情况下,我为什么要尝试绑定控件。为了回答这个问题,我认为可以在控件的“标记”属性中指定要绑定的属性,这样我就可以遍历可视化树并使用反射来获取属性值。

无论如何,以上只是我到目前为止的一些想法,我已经被困在这一点上很长时间了。如果您知道如何实现它或者您有更好的解决方案,请告诉我。提前致谢!

4

1 回答 1

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"));
于 2013-05-07T13:17:10.160 回答