2013-02-14 49 views
0

我正在學習使用MVVM Light,並且正在製作一個使用實體框架的數據庫優先模型的程序。WPF MVVM Light DataGrid帶編輯記錄按鈕和多個編輯窗口

我有一個DataGrid綁定到一個ViewModel,它從一個Repository中獲取數據。我試圖創建一個按鈕,當它被點擊時打開一個窗口,綁定到它自己的View Model並允許你添加一個記錄通過將其添加到存儲庫中,DataGrid具有一個事件,在添加項目時調用該事件,以便它可以更新DataGridViewModel。

這裏的一切都很好。我打開表單,鍵入數據,按添加,記錄被添加到數據庫中,DataGrid會通過存儲庫事件自動刷新。

問題出現在打開多個「添加記錄」窗口時。當我在其中一個窗口中鍵入內容時,它會顯示在另一個窗口中。

我知道這是因爲「添加記錄」窗口的兩個實例綁定到視圖模型的同一實例。

有沒有辦法解決這個問題,所以每個窗口都可以獨立?我知道目前這看起來並不是什麼大問題,但是我將來會計劃使用同一個窗口和相同的視圖模型來編輯記錄(這是一個很好的方法,您能否以某種方式推薦我記錄ID或記錄本身從DataGrid窗口添加/編輯記錄窗口?)。

在此先感謝!告訴我,如果我錯過了一些東西,我將它添加:)

編輯: 確定這就是我想出了:

public EditParentViewModel EditParent 
    { 
     get 
     { 
      EditParentViewModel editParentViewModelInstance = new EditParentViewModel(ServiceLocator.Current.GetInstance<IParentsRepository>(), 
       ServiceLocator.Current.GetInstance<IChildrenRepository>(), 
       ServiceLocator.Current.GetInstance<IBailiffsRepository>()); 
      return editParentViewModelInstance; 
     } 
    } 

這是工作,但這個是提供一個正確的方法視圖模型的存儲庫?

+0

視圖模型單身?可以爲每個對話框實例創建一個新的視圖模型 – Joao 2013-02-14 17:33:25

+0

是的,它是單身人士。我正在使用簡單的IOC MVVM Light提供的,所以我不確定我應該如何爲窗口的每個實例創建一個單獨的viewmodel實例。 – Phoenix 2013-02-14 18:37:02

回答

0

計數您正在使用ViewModelLocator,你應該有這樣的事情:

public class ViewModelLocator 
{ 
    public ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     SimpleIoc.Default.Register<AddRecordViewModel>(); 
    } 

    public AddRecordViewModel AddRecordViewModel 
    { 
     get { return ServiceLocator.Current.GetInstance<AddRecordViewModel>(); } 
    } 
} 

只是每次都返回一個新的視圖模式:

public class ViewModelLocator 
{ 
    public ViewModelLocator() 
    { 
    } 

    public AddRecordViewModel AddRecordViewModel 
    { 
     get { return new AddRecordViewModel(); } 
    } 
} 

這樣,你的形式總是得到一個新的觀點模型,而不是獲取當前實例分配在您的ServiceLocator

+0

只有一件小事情可以檢查主要問題上的編輯。 :) – Phoenix 2013-02-14 19:41:30

+0

具有相同視圖模型的多個實例是完全好的(也是常見的)。檢查'Si​​mpleIoc.Register()'重載並查看除了查看模式類型之外您還可以傳遞一個鍵。然後你可以使用同樣的密鑰'GetInstance()'。關於如何實施ServiceLocator的底線由您決定。您可以使用其他IoC庫的事件,但再次,多個實例都可以。 – Joao 2013-02-14 20:55:40

+0

好的非常感謝你的幫助:) – Phoenix 2013-02-14 22:10:02