1

ユーザー コントロール用の一般的な Observer パターンを実装したいと考えています。これを行う最善の方法は何ですか?

A、B、C の 3 つのユーザー コントロールがあります。これらの各ユーザー コントロールは、一連のデータを表します。各コントロールには、表示モード (基本または詳細) の選択があります。サイトの訪問者は、どのモードを選択するかを取得します。いずれかのコントロールで表示モードを変更すると、他のコントロールにもその変更が反映されます。

ここでのキラーは、サイトの訪問者がユーザーコントロールをページに動的に追加できることです。そのため、ページには、それらのいずれも含まれないコントロールの任意の組み合わせが含まれる場合があります。また、複数の aspx ページに掲載される場合もあります。

オブザーバー パターンが最善のアプローチだと考えていましたね。もしそうなら、これを達成するための最良の方法の例はありますか?

ありがとう、リチャード

4

2 に答える 2

1

同じユーザー入力に応答する必要がある複数のユーザー コントロールを扱ってきました。

System.Web.UI.Page から継承した基本ページを作成しました。ここにユーザー入力をプロパティとして含めました (これについては後で詳しく説明します)。

このインターフェースを定義しました

public interface IRespondToInput 
{
    int InputID 
    {
        get;
        set;
    }
}

わかりました、正確にはそう呼ばれていませんでしたが、変更が実装されていることを確認したかった各ユーザーコントロール。このインターフェイスは、ベース ページのプロパティを反映する単一のプロパティで構成されていました。

public int InputID 
{
  get
  { 
    return _inputID 
  }
  set
  {
    _inputID = value;
    SetInputs(this, _inputID);
  }
}

基本ページ メソッドのセッターで、コントロール階層を再帰的にジャンプするルーチンを呼び出し、IRespondToInputを実装するものを探し、このインターフェイスに一致するユーザー コントロールが見つかるたびにプロパティを設定します。(コードを参照)

 protected void SetInputs( Control theControl, int theInputID )
    {
        if (theControl.Controls.Count > 0)
        {
            foreach (Control mySubControl in theControl.Controls)
            {
                if (mySubControl is UserControl || mySubControl is System.Web.UI.HtmlControls.HtmlForm)
                {
                    if (mySubControl is IRespondToInput)
                    {
                        ((IRespondToInput)mySubControl).InputID = theInputID;
                    }

                    SetInputs(mySubControl, theInputID);
                }
            }
        }
    }

これにより、ユーザー コントロールでローカル バインド イベントがトリガーされます。

実際には、継承されたページからプロパティを呼び出すこともできました。

例 (ユーザー コントロール コード ビハインド)

int mySetting = ((MyBasePage)Page).InputID;

準拠したコントロールを準拠したページにドロップして、それらを機能させたかっただけです。このアプローチはあなたのために働くかもしれません。

オリジナルポスター用に追加

このロジックを派生ベース ページに配置したくない場合は、別の UserControl ( D - 例の続き ) を作成して、切り替えロジックをカプセル化し、IRespondToInputインターフェイスを実装するすべてのコントロールを見つけてみませんか?

この UserControl では、セッターは次のようになります:-

public int InputID 
{
  get
  { 
    return _inputID 
  }
  set
  {
    _inputID = value;
    SetInputs(Page, _inputID);
  }
}

このコントロールを UserControls A、B、および C のサブコントロールとして組み込みます。

このように、すべてのページをADerivedPageにする必要はありません。ユーザー コントロールを必要なページに配置するだけで済みます。Pageから継承されるため、パラメーターとして渡すことも問題ありませんControl

于 2009-10-13T10:11:09.443 に答える
1

いずれかのコントロールで表示モードを変更すると、他のコントロールにもその変更が反映されます。

ページに単一の設定を持たないのはなぜですか? すべてのコントロールで同じ設定を乗算するのはなぜですか?

DropThingsを見ることに興味があるかもしれません。その著者は、彼がそれをどのように行ったかを説明する本も書いています。ASP.NET 3.5 を使用した Web 2.0 ポータルの構築

ASP.NET 3.5 を使用した Web 2.0 ポータルの構築

于 2009-10-13T09:57:59.847 に答える