我有一个动态加载xaml的子窗口,现在我想做一些绑定,以便在子窗口和父窗口之间传递消息。因为该项目是基于插件的,并且shell不可能只负载加载插件并帮助他们进行通信,以确定xaml中的控件,所以在后面的代码中操作它们是不明智的。
我已经实现了一个AppDataStore类,它可以激发整个应用程序的消息传递。
AppDataStore.Values["SomeKey"] = "SomeObject";
因此我想知道是否可以将动态加载的控件绑定到viewmodel,因此在setter中我可以使用AppDataStore进行消息传递。此外,如果我能以这种方式实现一些验证,那将是完美的。
你可能想知道在我甚至不知道控件是什么的情况下我怎么试图绑定控件。为了回答这个问题,我认为可以在控件的“Tag”属性中指定要绑定的属性,因此我可以遍历可视树并使用Reflection来获取属性值。
无论如何,上面只是我的一些想法,直到现在,我已经被困在这一点很久了。如果您知道如何实施它或者您有更好的解决方案,请告诉我。提前谢谢!
答案 0 :(得分: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
可以是任何类型
这样你的消息是一个独立的组件,插件可以依赖它,但是所有组件都知道如何相互通信而不需要知道shell。
他们只需使用他们想要发送的消息类型在调解器上调用Publish
:
mediator.Publish(new MyMessageType("Hello"));