1

これはおそらく概念的な問題にすぎませんが、理想的な解決策を見つけることができないようです。

WCF を使用して、独自に作成した Web サービスを介してサード パーティ アプリケーションを制御する Silverlight クライアント アプリケーションを作成したいと考えています。複数の Silverlight クライアントがある場合は、すべてのクライアントを同期する必要があります。つまり、1 つのクライアントからのパラメーターの変更をすべてのクライアントに伝達する必要があります。

サーバーに渡されるパラメーターを操作する非常に単純な Silverlight GUI をセットアップしました (クラスは INotifyPropertyChanged を継承します)。

public double Height
    {
        get { return frameworkElement.Height; }
        set
        {
            if (frameworkElement.Height != value)
            {
                frameworkElement.Height = value;
                OnPropertyChanged("Height", value);
            }
        }
    }

OnPropertyChanged は、データの転送を担当します。WCF サービス (duplex net.tcp) はすべてのクライアントのリストを維持し、データ パケット (パラメーター変更の説明を含む XElement) を受信するとすぐに、このパケットをすべてのクライアントに転送しますが、パケットの受信元はクライアントだけです。

クライアントはパッケージを受け取りますが、内部でプロパティを設定する最善の方法は何かわかりません。「高さ」(上記参照) を使用すると、新しい変更メッセージが生成され、他のすべてのクライアントに送信されます。

おそらく、データ フィールド (frameworkElement.Height) 自体または関数を使用できますが、後でデータ バインディングで問題が発生するかどうかはわかりません。また、冗長なコードによるバグを防ぐために、コード プロパティの一部を単純にコピーしたくありません。

それで、あなたは何をお勧めしますか?

ありがとう!

4

1 に答える 1

1

ここでの一般的な解決策の 1 つは、ブール値を使用して OnPropertyChanged 内で現在の状態を追跡することです。WCF パケットを受信したときに true に設定でき、true の場合は再ブロードキャストしません。プロパティを設定した後、それを false に設定します。

プロパティを通常どおりに設定する場合は、false のままにします。これにより、内部で設定された場合は正常にブロードキャストされますが、WCF 呼び出しを介して設定された場合はブロードキャストされません。

このオプションは機能しますが、正しく行うには注意が必要です。このロジックを 1 つのポイントにまとめているため、正しく理解するのはかなり簡単です。

于 2011-01-05T16:49:37.217 に答える