2011-01-08 18 views
1

私は最初のSilverlightアプリケーションを構築しています。このアプリケーションには、ユーザーが顧客、ベンダー、スタッフなどを保存できるいくつかのフォームがあります。各ページには、1つの親のusercontrol(対応するviewmodel)と1つ以上の子usercontrol(それぞれ独自のviewmodel)があります。たとえば、顧客フォームは顧客のusercontrolを親として持ち、Address Usercontrol、Phone Numbers UserControlをChild usercontrolsとしてフォーム上に配置します。現在、親「顧客」は、ユーザーが「保存」ボタンをクリックしたときに顧客、住所、および電話のためにデータが保管されることを保証します。その背後では、顧客、住所、電話番号のビューモデル間でdatacontextインスタンスを共有できます。したがって、Saveボタンをクリックすると、customer usercontrolは3つすべてのデータを保存することができます(datacontextにはAddressおよびPhoneNumberエンティティも含まれるため)。ビューモデル間のコンテキストの共有

このdatacontextを顧客から住所と電話番号に渡す方法を知りたいですか? 1つの方法は、datacontextをそれぞれのコンストラクタのAddressおよびPhone Numberビューモデルに渡すことですが、Customer viewodelが作成された後にのみAddressおよびPhoneNumberコンストラクタが呼び出されるようにする必要があります。よりよい解決策がありますか? MEFはもっと良い解決策を提供していますか?

答えて

1

あなたはSilverlightクライアント側の能力を持っています。意味:あなたは統計情報を持っています:-)

私が最近使ったのは、ContextCacheを作成することでした。基本的には、自分のViewModelで使用するために、すべてのRIAコンテキストを保持する静的クラスです。これと同じように:だから

public static class ContextCache 
    { 
    private static TicketContext _ticketContext; 

    public static TicketContext TicketContext 
    { 
     get 
     { 
     if (_ticketContext == null) 
      _ticketContext = new TicketContext(); 

     return _ticketContext; 
     } 
     private set { _ticketContext = value; } 
    } 
    } 

、ViewModelにに、あなただけのContextCache.TicketContextに電話をかけると、変更を保存することができます。このようにして、RIAの状態変化の追跡をすべて利用でき、オブジェクトの永続性についての詳細をすべて処理できるようになります(サービスを正しくコーディングしていれば、それは別の話です)。

0

おそらく、あなたのアーキテクチャでは、ASP.NETのセッションをシミュレートするかもしれないIsolatedStorageFileで解決できない可能性があります。

私の理解から、アプリケーションでMV-VMパターンを過度に使用しようとしています!重要な理由の1つは、ユニットテスト可能のために私たちの生活に入ったViewModelです!私があなただったら、Customer ViewModelを持っていて、私のの子ユーザコントロールにそれを使っていたでしょう!

子コントロールに別途ViewModelが必要な場合は、複雑さと隔離によっては、ViewModelと考えられ、子のプロパティがViewModelとなる場合があります。

public class ParentViewModel : FrameworkElement { 

    Child1ViewModel Child1 { get; set; } //Must be a dependency property 

    Child1ViewModel Child2 { get; set; } //Must be a dependency property 

    ICommand SaveButtonCommand; //Your delegate command of your save button 

    public ParentViewModel() { 
     Child1 = new Child1ViewModel(); 
     Child2 = new Child2ViewModel(); 
    } 
} 

、あなたはまた、あなたのParentViewModelICommand SaveButtonCommandを持っているし、クリックしたときにあなたの子供ViewModelpropertiesで操作するあなたの親XAML

<UserControl.DataContext> 
    <ViewModels:ParentViewModels /> 
</UserControl.DataContext> 
<Controls:Child1 DataContext="{Binding Child1}" /> 
<Controls:Child2 DataContext="{Binding Child2}" /> 

でこの親ビューを使用することができます!

希望しました!

関連する問題