如何构建MVVM风格的用户控件?

时间:2011-08-04 14:23:04

标签: wpf mvvm user-controls

WPF:如何构建MVVM风格的用户控件?

在WPF中,我们可以设计用户控件,类似于Asp.Net或Winform。

在WPF中,我们有MVVM设计模式,类似于MVC。

但是在WPF中是否可以构建MVVM风格的用户控件?

我无法得到它 - 如果它是一个用户控件,它可以加载到工具箱栏中,然后拖放到WPF页面,它怎么可能是MVVM?一个WPF页面只是一个“View”,所以用户控件也只是“View”,没有“ViewModel”,对吗?

感谢你们的回复。是否有一个很好的简单例子,我可以阅读代码来理解?

4 个答案:

答案 0 :(得分:2)

通常我创建一个WPF UserControl,期望它将与特定的ViewModel一起使用。

例如,我可能有CalendarControlCalendarViewModelCalendarControl从不直接引用CalendarViewModel,但它确实会绑定到CalendarViewModel,因此会在绑定中指定CalendarViewModel属性

在WPF应用程序中,ParentViewModel通常会公开类型为CalendarViewModel的属性,并负责创建CalendarViewModel。父视图通常包含与此类似的代码:

<Window.Resources>
    <DataTemplate DataType="{x:Type local:CalendarViewModel}">
        <local:CalendarControl />
    </DataTemplate>
</Window.Resources>

... 

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

另一种选择(如果使用拖放)标记可能如下所示:

<local:CalendarControl DataContext="{Binding CalendarViewModelProperty}" />

答案 1 :(得分:1)

设计良好的UserControl应该能够在包括MVVM在内的许多架构中使用。

一般来说,您不需要使用MVVM框架来构建 UserControl。这可能是矫枉过正的。 MVVM是一种架构模式,其范围比大多数设计模式更广泛。

在设计UserControl时,您可以从MVVM中获得很好的经验教训:

  • 清楚了解UserControl将要使用的数据模型。
  • 保持演示逻辑和数据模型在您的设计中分离。
  • 使用WPF,确保您可以轻松地将模型绑定到用户控件。

答案 2 :(得分:0)

通常我会将UserControl视图用于我的详细信息页面以及某种ItemsControl(ListBox / TreeView等)。我的项控件使用ViewModel中包装的对象填充。详细信息页面(UserControl)将其datacontext设置为ItemsControl的选定项属性,以便在选择项目时,用户控制datacontext将被传递给SuchAndSuch ViewModel。

还有其他方法可以做到这一点,这完全取决于你想要的方式。您可以在代码中实例化控件并分配它的viewmodel,您可以在XAML定义中设置viewmodel。这完全取决于您想要使用它的方式,以及您的应用程序的结构。

答案 3 :(得分:0)

UserControl可以像所有其他视图一样拥有ViewModel。 在另一个窗口中使用UserControl时,将在加载UserControl时实例化ViewModel。 但是你使用哪个MVVM框架?我真的建议你使用一个。 (如CinchV2)