2015-11-14 17 views
0

我已將視圖的數據上下文設置爲View的代碼背後的相關ViewModel。但在閱讀a question on the MVVM pattern,後,建議將此膠水代碼移至視圖的XAML標記。如何將數據上下文重新連接到C#中的XAML?

谷歌搜索已經顯示出我XAML中設置下面的上下文的例子,by setting a namespace to the VM and setting data context.

雖然在我的情況下,MainViewModel需要CustomerRepository實例的參數,這我不知道如何成立XAML,基於前面的例子。

有誰知道如何將數據上下文移動到視圖的XAML?

這是我的當前設置視圖的代碼隱藏在C#:

public partial class MainView : Window 
    { 
     private MainViewModel ViewModel { get; set; } 

     public MainView() 
     { 
      InitializeComponent(); 
      ViewModel = new MainViewModel(CustomerRepository.Instance); 
      this.DataContext = ViewModel; 

     } 

    } 

回答

1

可以實例視圖模型在XAML這樣的:

<Window x:Class="MyWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Title="Test" 
      xmlns:viewModel="clr-namespace:ViewModels"> 
     <Window.DataContext> 
      <viewModel:ExampleViewModel/> 
     </Window.DataContext> 
</Window> 


你解釋過你的視圖模型構造函數有一個你的倉庫的參數。你需要這個構造函數來進行單元測試嗎?

通常,您可以在視圖模型的無參數構造函數中新增存儲庫實例。

public class MainViewModel : ObservableObject, INotifyPropertyChanged 
{ 

    private static CustomerRepository _customerRepository; 

    // existing constructor 
    public MainViewModel(CustomerRepository customerRepository) 
    { 
     _customerRepository = customerRepository; 
    } 

    // new parameterless constructor 
    public MainViewModel(CustomerRepository customerRepository) 
    { 
     if (DesignerProperties.GetIsInDesignMode(this)) 
     { 
      _customerRepository = new CustomerRepository();   
     } 
    } 
} 


檢查是否處於設計模式

有你需要考慮建立在XAML視圖模型時的一兩件事:視圖模型構造函數被調用在設計你打開視圖的時間。 因此,您需要將構造函數中的任何代碼包含在設計時沒有任何意義的代碼中,並將其轉換爲「僅在不符合設計時」條件時。 如果您不這樣做,您的視圖將打開並在設計器中出現錯誤。

這這種反應說明:Check if in design mode

+0

沒關係很好的建議,打算使用創建第二個參數構造函數少,調用現有的方法。 我知道如何設置一個無參數ctor,但是我怎樣才能定義一個來自我的第二個ctor的呼叫?我見過使用base()的建議,但不知道如何實現。 我的VM設置了這樣的參考: https://github.com/BrianJVarley/MongoDB_App/blob/master/MongoDBApp/ViewModels/MainViewModel.cs –

+0

你可以從一個新的像這樣的調用現有的構造:'public MainViewModel():this(new CustomerRepository())'。但是在第二次思考它之後,我認爲最好只是在不調用現有構造函數的情況下在新的無參數構造函數中創建存儲庫。因爲那樣你可以檢查你是否在設計時間。看到我編輯的回覆。 – Martin

+0

很酷,你有沒有遇到過使用這個https://msdn.microsoft.com/en-us/library/system.windows.data.objectdataprovider.aspx?作爲一個解決方案,有一個超載ctor?我試着使用你的上面的建議,但我不能'新'我的回購實例,因爲它是靜態單例。 –

相關問題