2016-04-21 110 views
0

我需要一些幫助,將viewModel綁定到我創建的兩個usercontrol視圖。使用Mvvm綁定datacontext viewmodel到usercontrol視圖

已經創建了一個應包含這兩個usercontrols的預留窗口。

我得到了什麼:

  • ReservationView(窗口)
  • ReservationListView(用戶控件)
  • ReservationDetailView(用戶控件)

ReservationView(窗口)類

public partial class ReservationView : Window 
{ 
    public ReservationView() 
    { 
     InitializeComponent(); 
     //DataContext = null;    
    } 
} 

ReservationListView(用戶控件)類:

public partial class ReservationListView : UserControl, IViewReservationListViewModel 
{ 
    public ReservationListView(IViewReservationListViewModel viewModel) 
    { 
     InitializeComponent(); 
     DataContext = viewModel; 
    } 
} 

的IViewReservationListViewModel僅僅是一個空的接口,這使得該用戶控件視圖和視圖模型之間的接觸。

ReservationListViewModel

public class ReservationListViewModel : INotifyPropertyChanged, IViewReservationListViewModel 
{ 
    public ReservationListViewModel() 
    { 

    } 
} 

當我嘗試設置本地:在裏面ReservationView的XAML 「用戶控件」,我得到以下錯誤:

The type "ReservationListView" does not include any accessible constructors. 

我應該如何連接這兩個用戶控制到相應的viewModels當我使用MVVM?

+1

要創建它,你需要一個沒有參數的公共構造函數。你必須通過綁定來賦予它視圖模型。通常,如果視圖模型擁有某個列表(例如'ReservationList'),則其視圖將創建一個控件來顯示該列表,並將子控件的屬性綁定到視圖模型的適當部分。如果視圖和控件都使用相同類型/實例的虛擬機,則可以綁定' - 將父級的datacontext綁定到該屬性。 –

+0

'DataContext'屬性通常從父UI對象繼承,並且幾乎從不像在UserControl中那樣在代碼隱藏中設置。所以擺脫這一行,使其成爲一個無參數的構造函數,並確保您的DataContext繼承或正確設置父UI對象。 [克萊門斯的回答](http://stackoverflow.com/a/36778349/302677)是如何做到這一點的一個例子。 :) – Rachel

回答

5

你通常有一個像

class MainViewModel 
{ 
    public ReservationListViewModel ReservationListViewModel { get; set; } 
    public ReservationDetailViewModel ReservationDetailViewModel { get; set; } 
} 

一個MainViewModel並且會使用它在你的XAML像

<Window.DataContext> 
    <local:MainViewModel/> 
</Window.DataContext> 

<local:ReservationListView DataContext="{Binding ReservationListViewModel}"/> 
<local:ReservationDetailView DataContext="{Binding ReservationDetailViewModel}"/> 

你的用戶控件不需要用任何參數的構造函數。

+0

這些行給了我一個「ReservationListView不支持Windows Presentation Foundation(Wpf)。 – Mikkel

+0

我忘了XAML命名空間前綴。現在補充。 – Clemens

+0

這是Mvvm規則? – Mikkel

相關問題