如何在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,其中说视图有构造函数参数?
我认为通过构造函数参数分配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}" />