2017-03-15 17 views
0

私は以下のビューとviewModelsビューを持っています:Staff、VM:StaffViewModelとView:Notes、VM:NotesViewModel。wpf mvvmlight viewmodelにデータを渡す

私のStaffViewModelには、SelectedEmployeeタイプのSelectedStaffMemberプロパティがあります。

スタッフビューには別のビュー(注釈)を起動するボタンがあります。

ユーザーがメモを入力すると、SelectedEmployeeに対して保存する必要があります。つまり、NotesViewModelは現在選択されている従業員IDを知る必要があります。

今私のViewModelLocatorでこれをやっていますが、これは間違っているようですが、どのような方法でVMにデータを渡すのですか?

私はMVVM Lightを使用しています。

関連するコード - StaffViewModel

public Employee SelectedEmployee 
    { 
     get { return _selectedEmployee; } 
     set 
     { 
      if (value == _selectedEmployee) return; 
      _selectedEmployee = value; 
      HolidayAllowance = _staffDataService.GetEmployeeHolidayAllowance(_selectedEmployee.Id); 
      RaisePropertyChanged(); 
      RaisePropertyChanged(nameof(HolidayAllowance)); 
     } 
    } 

NoteViewModel

public RelayCommand SaveNoteCommand { get; private set; } 

private void SaveNote() 
{ 
    var note = new Note 
    { 
     NoteContent = NoteContent, 
     EmployeeId = ViewModelLocator.Staff.SelectedEmployee.Id, 
     NoteDate = NoteDate 
    }; 

    _dataService.SaveNote(note); 
} 

私は追加のノートのビューを表示するMahAppsフライアウトを使用しています:ビューが示されており、 。これは、それがから起動されますMainView.xaml NOT Staff.xaml、SelectedEmployeeを取得する別の問題と思われるID:

MainView.xaml

<controls:Flyout Name="AddNoteFlyout" 
       Header="Add Note" 
       IsModal="True" 
       IsOpen="{Binding IsAddNoteOpen}" 
       Opacity="85" 
       Position="Right" 
       Width="450"> 
       <views:AddNote VerticalAlignment="Top" Margin="0,30,0,0"/> 
</controls:Flyout> 

私のスタッフビューが登録するビューを起動するボタンをクリックするとメッセージが表示されます。メッセージにはselectedEmployeeIdが含まれます。それは良い方法だろうか?

答えて

1

簡単な方法

簡単な方法は、あなたがやっていることですが、多分少しよりよい解決策はNavigationParameterContainerようstaticまたはsingletonクラスを作成し、公共の財産で選択StaffMemberを格納することです。次に、あなたのNotesViewModel

のベストプラクティス

でカスタムナビゲーションサービス、およびナビゲーションViewModels意識を使用しているViewModels間でデータを受け渡すためのよりよい解決策を、それを取得することができます。

MVVMLightはこれをサポートしていないため、Prismのような別のフレームワークを使用するか、パラメータ化されたナビゲーションを作成するために使用できるアーキテクチャを作成してください。

OnNavigatedToのようなナビゲーションライフサイクルコールバックをサポートするINavigationAwareインターフェイスを作成し、NavigationParamter(選択されたStaffMember)を表すオブジェクトを受け取るという基本的な考え方があります。

その後、あなたはあなたがPageにナビゲートしたい、とobjectウィッヒがNavigationParamterあるのかを決定するためにいくつかのパラメータを受け付けNavigate方法、とNavigationServiceのいくつかの種類を作成します。

ナビゲートするときは、サービス上でNavigateメソッドを呼び出し、選択した項目をパラメータとして渡します。その後、サービス内で実際のナビゲーションを行う必要があり、ナビゲーションが完了した後、INavigationAwareインターフェイスを実装している場合は、ViewModelOnNavigatedToコールバックを呼び出します。 (Page.DataContextからVMを取得し、OnNavigatedToと呼ぶことができるnullでない場合はINavigationAwareにキャストできます)。

最後に、NotesViewModelでINavigationAwareインターフェイスを実装し、OnNavigatedToメソッドで受け取ったパラメータを処理するだけで済みます。

これは単なる基本的なアイデアですが、これを実装しているMVVMフレームワークをご覧になることを強くお勧めします。 (PrismLibraryのように)。

関連する問題