我有3个控件 - ContractSelection,ContractInfo和ContractClips
我还有一个类 - ContractStructureService。这包含一个属性--SelectedContract
合同选择控件在组合框中显示用户的合同列表
当用户选择合约时,服务上的SelectedContract会发生变化。
我知道如何做到这一切 - 棘手的一点是,我希望在所选合同被更改时告知ContractInfo和ContractClips
public class FlexContractStructureService : IFlexContractStructureService
{
#region IFlexContractStructureService Members
private Contract _selectedContract;
public ViewModels.Contract SelectedContract
{
get { return _selectedContract; }
set
{
_selectedContract = value;
OnSelectedContractChanged(new SelectedContractChangedEventArgs(SelectedContract));
}
}
public event EventHandler SelectedContractChanged;
protected virtual void OnSelectedContractChanged(SelectedContractChangedEventArgs e)
{
if (SelectedContractChanged != null)
{
SelectedContractChanged(this, e);
}
}
如何使用Silverlight执行此操作?
我认为如果我在ContractInfo和ContractClipInfo中都有代码,如
service.SelectedContractChanged += ContractChanged
这是不是意味着当我调用OnSelectedContract时,只会通知一个对象?
保
答案 0 :(得分:1)
这里有几个问题。
对于最后一部分,event
意味着多播,即能够通知代表列表。所以,不,不仅通知了1个对象。
现在,对于主要问题,在Silverlight中,您有几种选择,具体取决于您已经使用的内容:
如果您可以直接引用相关对象,则可以按照建议使用事件和委托。这会导致可能不合适的耦合,并且还会造成泄漏/代理垃圾邮件风险。这意味着什么:您必须非常小心地取消订阅添加到活动中的每个代表。
您可以使用非耦合通信模式,例如Messenger
(MVVM Light)或类似的东西(广播/订阅者)。你在这里有一个广播点:OnSelectedContractChanged
你可以在那里发送通知(再次在MVVM Light中:Messenger.Default.Send(new SelectedContractChangedNotification(_selectedContract));
)。您可以在应用程序的其他地方(Messenger.Default.Register<SelectedContractChangedNotification>(this, OnSelectedContractChanged);
)随时随地接收此通知,并且您可以根据需要使用尽可能多的接收器。