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

ここでは、いくつかの質問が1つにまとめられています。

最後の部分では、aneventはマルチキャスト、つまりデリゲートのリストに通知できるようにすることを目的としています。つまり、通知されたオブジェクトは1つだけではありません。

さて、主な質問として、Silverlightには、すでに使用しているものに応じて、いくつかのオプションがあります。

  • 関連するオブジェクトへの直接参照を取得できる場合は、提案するイベントとデリゲートを使用できます。これにより、望ましくない可能性のある結合が発生し、リーク/デリゲートスパムのリスクが発生します。これが意味することは、イベントに追加された各デリゲートのサブスクライブを解除するために非常に注意する必要があるということです。

  • 非結合通信パターン、たとえばMessenger(MVVM Light)または同様のもの(ブロードキャスト/サブスクライバー)を使用できます。ここにブロードキャストのポイントがあります:OnSelectedContractChangedここで通知を送信できます(MVVMLightで再び:) Messenger.Default.Send(new SelectedContractChangedNotification(_selectedContract));。この通知は、必要な数の受信者を使用して、アプリケーション()の他の場所で必要な場所で受信できますMessenger.Default.Register<SelectedContractChangedNotification>(this, OnSelectedContractChanged);

于 2012-09-03T07:01:44.410 に答える