WPF - 如何使用XAML

时间:2015-09-29 03:04:43

标签: c# wpf xaml mvvm

我最近一直在审查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具有构造函数参数?

1 个答案:

答案 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}" />