0

我有 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 更改时,只通知 1 个对象?

保罗

4

1 回答 1

1

这里有几个问题合二为一。

对于最后一部分,anevent意味着多播,即能够通知代表列表。所以,不,不仅通知了 1 个对象。

现在,对于主要问题,在 Silverlight 中,您有几个选项,具体取决于您已经在使用什么:

  • 如果您可以获得对相关对象的直接引用,则可以按照您的建议使用事件和委托。这会导致可能不需要的耦合,并且还会带来泄漏/委托垃圾邮件的风险。这意味着:您必须非常小心地取消订阅每个添加到事件的委托。

  • 您可以使用非耦合通信模式,例如Messenger(MVVM Light)或类似的东西(广播公司/订阅者)。您在这里有一个广播点:OnSelectedContractChanged您可以在其中发送通知(再次在 MVVM Light 中:)Messenger.Default.Send(new SelectedContractChangedNotification(_selectedContract));。可以在应用程序的任何其他地方(Messenger.Default.Register<SelectedContractChangedNotification>(this, OnSelectedContractChanged);)的任何地方接收此通知,并根据需要使用尽可能多的接收器。

于 2012-09-03T07:01:44.410 回答