2012-03-03 92 views

回答

2

我認爲這取決於用戶控制。用戶控件可以只是一個視圖,在這種情況下,您可以編寫一個更大的控件或頁面,並將該用戶控件作爲整體的一部分。較大的控件或頁面將爲此視圖提供視圖和視圖模型部件。

或者您可以創建一個自包含的用戶控件,它具有所有mvvm並使用事件與它所屬的較大用戶控件進行交互。

我懷疑你會通過第二種方法獲得更好的重用和模塊化。

總之:這取決於。

+0

如果我從MVVM使用定義我的控制...我怎樣才能從我的使用控制?如何將我的屬性綁定到xaml代碼中的Control View模型? – 2012-03-03 08:56:29

+0

您的控件的xaml將綁定到它的視圖模型。外部模型(較大控件的模型)的工作就是創建內部視圖模型並將其傳遞到內部視圖/控件的實例中。 – Rohith 2012-03-03 09:00:56

+0

你能給我一個這樣的示例代碼嗎? – 2012-03-03 09:10:18

3

我們只需調用嵌入用戶控件MainWindow的控件和用戶控件UserControl即可。由於您處於MVVM模式,因此您至少有一個視圖模型用於外部視圖 - 我通常使用名稱MainVm。 用戶控件有兩種選擇:它們可以共享相同的視圖模型,或者可以有一個子視圖模型,僅用於UserControl,即UserVm。

你的第一選擇,你什麼都不做。您可以定義UserControl(Visual Studio'添加新項目' - >用戶控件是一個非常好的開始)。然後,您只需將它嵌入主窗口。

<Window 
    x:Class="SO.MainWindow" 
    ... 
    xmlns:src="clr-namespace:SO" 
    ... 
    > 
    ... 
    <src:UserControl /> 
    ... 
</Window> 

UserControl將從MainWindow繼承相同的DataContext,並像在MainWindow中那樣執行所有{Binding}。

如果你想有一個子視圖模型(UserVm) - 它通常是MainVm(比如userVm)的一個公共屬性。在這種情況下,當您引用它時,您將設置UserControl的DataContext。

<src:UserControl DataContext="{Binding Path=userVm}" /> 

另一個流行的範例是聲明DataTemplate而不是UserControl。如果你這樣做,你只需要把UserVm(或者初始化它在XAML,或通過結合):

<Window x:Class="MainWindow" ...> 
    <Window.Resources> 
     <DataTemplate x:Key="UserDt"> <!-- or user TargetType instead of x:Key --> 
      ... 
     </DataTemplate> 
    </Window.Resources> 

    ... 

    <!-- You can put in a ContentControl like here: --> 
    <ContentControl Content="{Binding Path=userVm}" 
        ContentTemplate="{StaticResource UserDt}" /> 

    <!-- or, if you defined TargetType for the DT, you can simply instantiate 
     the sub VM here. I don't like this apporach but it exists. --> 
    <src:UserVm /> 
</Window>