【问题标题】:Binding datacontext viewmodel to usercontrol view when using Mvvm使用 Mvvm 时将 datacontext viewmodel 绑定到 usercontrol 视图
【发布时间】:2016-08-15 03:53:17
【问题描述】:

我需要一些帮助,将 viewModel 绑定到我创建的两个用户控件视图。

已创建应包含这两个用户控件的预订窗口。

我得到了什么:

  • ReservationView(窗口)
  • ReservationListView(用户控件)
  • ReservationDetailView(用户控件)

ReservationView(窗口)类

public partial class ReservationView : Window
{
    public ReservationView()
    {
        InitializeComponent();
        //DataContext = null;              
    }
}

ReservationListView(用户控件)类:

public partial class ReservationListView : UserControl, IViewReservationListViewModel
{
    public ReservationListView(IViewReservationListViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;
    }
}

IViewReservationListViewModel 只是一个空接口,它在用户控件视图和 viewModel 之间建立联系。

ReservationListViewModel

public class ReservationListViewModel : INotifyPropertyChanged, IViewReservationListViewModel
{
    public ReservationListViewModel()
    {

    }
}

当我尝试在 ReservationView 内的 xaml 中设置 local:"usercontrol" 时,出现以下错误:

The type "ReservationListView" does not include any accessible constructors.

当我使用 MVVM 时,我应该如何将这两个用户控件链接到各自的 viewModel?

【问题讨论】:

  • 要按照您的尝试创建它,ReservationListView 需要一个不带参数的公共构造函数。您必须通过绑定为其提供视图模型。按照惯例,如果视图模型拥有某物的列表(例如ReservationList),它的视图将创建一个控件来显示该列表,并将子控件的属性绑定到视图模型的适当部分。如果视图和控件都使用相同类型/实例的 VM,您将绑定 ` -- 将父级的数据上下文绑定到该属性。
  • DataContext 属性通常是从父 UI 对象继承的,并且几乎不应该像在 UserControl 中那样在代码隐藏中设置。所以去掉那一行,让它成为一个无参数的构造函数,并确保你的 DataContext 是从父 UI 对象继承或正确设置的。 Clemens's answer 是如何做到这一点的一个例子。 :)

标签: wpf xaml mvvm user-controls


【解决方案1】:

你通常会有一个 MainViewModel 像

class MainViewModel
{
    public ReservationListViewModel ReservationListViewModel { get; set; }
    public ReservationDetailViewModel ReservationDetailViewModel { get; set; }
}

并且会在你的 XAML 中使用它

<Window.DataContext>
    <local:MainViewModel/>
</Window.DataContext>

<local:ReservationListView DataContext="{Binding ReservationListViewModel}"/> 
<local:ReservationDetailView DataContext="{Binding ReservationDetailViewModel}"/> 

您的 UserControls 不需要任何带参数的构造函数。

【讨论】:

  • 这些行给了我一个“Windows Presentation Foundation (Wpf) 不支持 ReservationListView。
  • 我忘记了 XAML 命名空间前缀。现已添加。
  • 这符合 Mvvm 规则吗?
  • 当然,是什么让你认为它不会?
  • 好的,它现在可以工作了 :) 我只是有点不安全,因为它违反了 MVVM 规则。
猜你喜欢
  • 2016-07-11
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多