如何在mvvm模式中定义用户控件?

时间:2012-03-03 08:44:11

标签: c# wpf mvvm user-controls

我在我的应用程序中使用mvvm。我想知道如何在mvvm模式中定义我的用户控件。

我必须使用mvvm来定义它,或者我可以一般地定义它吗?

2 个答案:

答案 0 :(得分:3)

让我们只调用嵌入用户控件MainWindow的控件,以及用户控件UserControl。由于您处于MVVM模式,因此外部视图至少有一个View Model - 我通常使用名称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>

答案 1 :(得分:2)

我认为这取决于用户控制。用户控件可以只是一个视图,在这种情况下,您将组成一个更大的控件或页面,该控件或页面具有此用户控件作为整体的一部分。较大的控件或页面将为此视图提供视图和视图模型部件。

或者您可以创建一个自包含的用户控件,该控件包含所有mvvm并使用事件与其所属的较大用户控件进行交互。

我怀疑你会通过第二种方法获得更好的重用和模块化。

简而言之:取决于。