我最近一直在审查Josh Smith的代码(来自他着名的MVVM文章),并且我一直在努力创建一个遵循他理想的MVVM模式的程序。
现在问题是,在Josh Smith的项目的MainWindowResources中,他将View绑定到(这里只使用任意名称)ExampleViewModel,因此TabControl(工作区)显示了ExampleView而不仅仅是ExampleViewModel的.ToString()。例如:
<DataTemplate DataType="{x:Type vm:ExampleViewModel}">
<vw:ExampleView />
</DataTemplate>
通常,当View不接受任何参数时,这段代码将起作用。但是对于这个项目,我在View的构造函数参数中使用了ViewModel:
public ExampleView(ExampleViewModel viewModel)
{
InitializeComponent();
DataContext = viewModel;
}
所以现在,我仍处于静止状态 - 这种类型的绑定只允许无参数构造函数。
那么如何解决这个问题,同时仍然将View绑定到ViewModel,其中所述View具有构造函数参数?
答案 0 :(得分:2)
我认为通过contructor参数分配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}" />