如何在XAML中绑定一个ViewModel和一个带参数的View

本文关键字:一个 参数 View ViewModel XAML 绑定 | 更新日期: 2023-09-27 18:14:53

我最近一直在审查Josh Smith的代码(来自他著名的MVVM文章),并且我一直在尝试创建一个遵循他理想的MVVM模式的程序。

现在这里是问题,在Josh Smith的项目的MainWindowResources中,他将视图绑定到(只是在这里使用任意名称)ExampleViewModel,因此TabControl(工作区)显示ExampleView而不仅仅是ExampleViewModel的. tostring()。例子:

<DataTemplate DataType="{x:Type vm:ExampleViewModel}">
  <vw:ExampleView />
</DataTemplate>

通常这段代码在视图不接受任何参数的情况下可以工作。但是对于这个项目,我采取ViewModel在视图的构造函数参数:

public ExampleView(ExampleViewModel viewModel)
{
    InitializeComponent();
    DataContext = viewModel;
}

所以现在,我处于静止状态——这种类型的绑定只允许无参数的构造函数。

那么我如何解决这个问题,而仍然绑定一个视图到ViewModel,其中说视图有构造函数参数?

如何在XAML中绑定一个ViewModel和一个带参数的View

我认为通过构造函数参数分配DataContext可能不是一个好主意,因为这是由dataTemplate 自动完成的,但对于任何其他参数,希望下面的建议有所帮助!
首先,如果您想在XAML中使用ExampleView,那么您需要有一个默认构造函数,因此上面的构造函数(在您的问题中提到)是而不是将工作。我建议您在ExampleView中定义一个名称为ViewModel的依赖属性,然后从XAML中使用它。像这样:

public static readonly DependencyProperty ViewModelProperty = DependencyProperty.Register
    (
         "ViewModel", 
         typeof(ExampleViewModel), 
         typeof(ExampleView), 
         new PropertyMetadata(null)
    );
    public ExampleViewModel ViewModel
    {
        get { return (ExampleViewModel)GetValue(ViewModelProperty ); }
        set { SetValue(ViewModelProperty , value); }
    }
    public ExampleView()
    {
        InitializeComponent();
    }
    //..........

}

然后你可以在XAML中这样写:

<vw:ExampleView ViewModel="{Binding}" />