2011-05-13 1 views
1

「共有」コードファイルを使用してドメインサービスを拡張し、StartMileageとFinishMileageからのマイルを次のように計算する「予約」クラスに追加プロパティを追加しました:Silverlight RIA:共有コードに変更通知を実装するには

public int? JourneyMileage 
     { 
      get 
      { 
       if (StartMileage.HasValue && FinishMileage.HasValue) 
       { 
        return (FinishMileage - StartMileage); 
       } 
       else 
       { 
        return null; 
       } 
      } 
     } 

StartMileageとFinishMileageは、自動生成されたドメインサービスのプロパティです。 プロパティJourneyMileageは、StartMileageとFinishMileageのようにUIにバインドされています。

StartMileageまたはFinishMileageが変更されたとき、JourneyMileageプロパティ(したがってUIも)を更新するにはどうすればよいですか?私はNotifyPropertyChangedのようなものを探していますが、空白を描いているようです。

答えて

2

共有予約クラスには、このような条件付きのSilverlightのコードブロックを追加します。

#if SILVERLIGHT 
    partial void OnStartMileageChanged(){ 
    RaisePropertyChanged("JourneyMileage"); 
    } 

    partial void OnFinishMileageChanged(){ 
    RaisePropertyChanged("JourneyMileage"); 
    } 

#endif 

これは機能するはずです。それをテストしてはいけません。

また、サーバー側でJourneyMileageプロパティを必要としない場合は、クライアント側で部分的な "予約"クラスを作成するために、プロパティを定義し、条件付きのステートメントなしで部分クラス。

1

あなたはJourneyMilageプロパティを更新しません。他のフィールドが変更されると変更されます。

値が変更されたことを他の人に通知する場合は、INotifyPropertyChangedを実装し、StartMilageまたはFinishMilageの変更時にJourneyMilageのPropertyChangedイベントを発生させます。

EDIT

See this post

+0

どこでINotifyPropertyChangedを実装しますか?それはドメインサービスのメタデータファイルにありますか? – Calanus

+0

私の答えの編集を参照してください –

0

これは動作するはずです。それをテストしてはいけません。

1)これは、プロパティ変更の通知が必要な場合、Silverlightでコンパイルされません。クライアント側で生成された共有クラスが別の名前空間から(SL内の他の.dll)で、プロパティを上げるための他のメソッドのシグネチャを使用すると、JourneyMileageプロパティを必要とするドント場合は別の方法は、ある:-(

を変更しました サーバー側で、クライアント側の部分「予約」クラスを作成するには、 あなたのプロパティを定義し、部分クラスに条件文 せずに自分のコードを置く。

2)これは動作しますし、可能性合理的な解決策にはなりますが、ビジネスロジックをEDMと共有することはできません:-(

3)[DataMember]属性を持つ生成されたメタデータクラスにプロパティを追加することもできます。欠点(またはいくつかのユースケースの利点)は、そのようなプロパティを変更すると、コンテキストが変更されるように設定されることです。

関連する問題