我在我的应用程序中使用mvvm。我想知道如何在mvvm模式中定义我的用户控件。
我必须使用mvvm来定义它,或者我可以一般地定义它吗?
答案 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并使用事件与其所属的较大用户控件进行交互。
我怀疑你会通过第二种方法获得更好的重用和模块化。
简而言之:取决于。