2010-05-20 61 views
6

我正在創建一個wvf用戶控件,它是mvvm模式。 所以我們有:view(代碼隱藏文件中沒有代碼),viewmodel,model,dataaccess文件。如何在MVVM模式中加載wpf usercontrol

我有主窗口的.xaml作爲視圖文件,這是我需要與MainWindowModel的.cs結合。

通常,在一個wpf應用程序中,我們可以使用App.xaml文件中的onStartUp事件來做到這一點。但在用戶控制中,因爲我們沒有App.xaml ...我如何實現它?

請幫助:(...先謝謝了!

回答

16

您可以使用ContentControl,具有DataTemplate綁定UserControl(視圖)視圖模型:

<DataTemplate DataType="{x:Type vm:MyViewModel}"> 
    <v:MyUserControl /> 
</DataTemplate> 

... 

<ContentControl Content="{Binding Current}" /> 

WPF會根據Content

+0

我們不需要任何屬性(依賴屬性或普通屬性)...在內容標籤中?或者「當前」如何滿足相同的內容? – Relativity 2010-05-20 12:47:58

+0

嗨托馬斯,你能給我一個關於上述查詢的想法嗎? – Relativity 2010-05-21 06:15:56

+1

在上面的代碼中,「Current」將是數據上下文的屬性,類型爲「MyViewModel」 – 2010-05-21 09:22:00

2

自動選擇DataTemplate我一直在使用MVVM Light Toolkit它有一個ViewModelLocator類,你可以把道具ERTIES在的ViewModels然後你在你的Mainwindow.xaml創建於ViewModelLocator的參考,像這樣:

<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True"/> 

在網格面板,或者你使用,你就可以這樣設置的DataContext什麼:

<Grid DataContext="{Binding MainWindowViewModel, Source={StaticResource Locator}}"> 
... 
</Grid> 

你也可以去MEFedMVVM在能夠交換不同的視圖模型實現到視圖方面潛在地增加了更多的靈活性。

這兩個庫的靈活性在於,如果您不想使用ViewModel基類,則ViewModelLocator和MEFedMVVM可以與任何類一起使用。

2

有無數的方法來做到這一點,它們都屬於兩種類別之一:「先查看」或「先模型」。

在「視圖第一」模式下的視圖(例如,您的主窗口)創建,然後再(例如,在代碼隱藏)視圖實例化視圖模型,並將它作爲其的DataContext):

private void WindowLoaded(object sender, EventArgs args) 
{ 
    this.DataContext = ViewModelService.GetViewModelX(); 
} 

在一個「模型第一」模式ViewModel首先在那裏,然後實例化視圖。

// method of the viewmodel 
public void LoadView() 
{ 
    // in this example the view abstracted using an interface 
    this.View = ViewService.GetViewX(); 
    this.View.SetDataContext(this); 
    this.View.Show();  
} 

這裏給出的例子只是許多方法中的一種。你可以看看各種MVVM frameworks,看看他們是如何做到的。

+0

謝謝..我會看看它 – Relativity 2010-05-20 10:16:05

+0

隨意標記你喜歡的答案作爲接受的答案。 – bitbonk 2010-05-20 10:48:22

+0

在MVVM模型中,我們可以在代碼後面的代碼中使用代碼嗎? – Relativity 2010-05-20 10:50:44

0

我們可以使用ObjectDataProvider調用對象..as內的方法如下:

<ObjectDataProvider ObjectType="{x:Type local:TemperatureScale}" 
        MethodName="ConvertTemp" 
        x:Key="convertTemp"> 

反正有做使用的DataTemplate

5

同我知道這是一個古老的,回答問題,但我有一個不同的方法。我喜歡在App中建立隱式關係。xaml文件:

<Application.Resources> 
    <DataTemplate DataType="{x:Type ViewModels:KioskViewModel}"> 
     <Views:KioskView /> 
    </DataTemplate> 
</Application.Resources> 

由此,不需要在任何地方設置DataContext。

UPDATE >>>

針對@Vignesh Natraj的要求,這裏是一個更全面的解釋:

一旦你在Resources元素建立DataTemplate,你可以在這個例子中顯示KioskView通過在您的XAML中的任何位置添加KioskViewModel的實例。這可能是填充MainWindow,或者只是在屏幕的特定部分。您還可以在ListBox中託管KioskViewModel的多個實例,並且它將生成多個KioskView實例。

根據您的要求,您可以用幾種方法將KioskViewModel的實例添加到XAML中。一種方法是爲包含KioskViewModel.cs文件的項目聲明XML命名空間,並將其實例添加到ContentControl中希望顯示視圖的頁面中。舉例來說,如果你有一個UserControl稱爲MainViewKioskViewModel.cs文件是在一個Kiosk.ViewModels命名空間,你可以使用基本的XAML這樣的:

<UserControl x:Class="Kiosk.Views.MainView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ViewModels="clr-namespace:Kiosk.ViewModels"> 
    <UserControl.Resources> 
     <ViewModels:KioskViewModel x:Key="KioskViewModel" /> 
     <DataTemplate DataType="{x:Type ViewModels:KioskViewModel}"> 
      <Views:KioskView /> 
     </DataTemplate> 
    </UserControl.Resources> 
    <ContentControl Content="{StaticResource KioskViewModel}" /> 
</UserControl> 

我更喜歡使用與WPF的MVVM設計模式,所以我會提供有用功能的基本視圖模型類,例如實現基本的接口。然後我在BaseViewModel類型的主(頂級)視圖模型中有一個名爲ViewModel的屬性。這爲我提供了一種很好的方法,可以將ViewModel屬性更改爲衍生自BaseViewModel的任何視圖模型,因此可以從視圖模型中更改關聯的視圖。

例如,在綁定到MainViewMainViewModel.cs類有一個字段和相關屬性:

private BaseViewModel viewModel = new KioskViewModel(); 
public BaseViewModel ViewModel 
{ 
    get { return viewModel; } 
    set { viewModel = value; NotifyPropertyChanged("ViewModel"); } 
} 

正如你可以看到,它開始了作爲一個KioskViewModel實例,但可以改變任何隨時響應用戶交互的其他視圖。對於這種設置中,XAML是非常相似的,但不是宣佈在Resources元素視圖模型的實例,我們綁定到財產的MainViewModel

<UserControl x:Class="Kiosk.Views.MainView" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:ViewModels="clr-namespace:Kiosk.ViewModels"> 
    <ContentControl Content="{Binding ViewModel}" /> 
</UserControl> 

注意,在這個例子中,我們需要聲明兩個(或更多,以使這種方法很有用)DataTemplate S IN的App.xaml文件:

<Application.Resources> 
    <DataTemplate DataType="{x:Type ViewModels:MainViewModel}"> 
     <Views:MainView /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type ViewModels:KioskViewModel}"> 
     <Views:KioskView /> 
    </DataTemplate> 
</Application.Resources> 
+0

你能解釋一下我是如何工作的嗎?我試過這個,但是沒有任何東西被我的觀點束縛。 我知道它的舊但感謝。 – 2013-03-01 09:38:33

0

你也許可以看看MSDN。我覺得它是一個很好的資源,雖然它沒有解釋如何使用usercontrols,但你會發現你的出路。