如何使用prism wpf为用户控制设置数据上下文?

时间:2017-06-12 00:53:52

标签: wpf mvvm prism datacontext

这是我的 view.xaml

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height=".5*"/>
        <RowDefinition Height="0.5*"/>
    </Grid.RowDefinitions>

    <Grid Grid.Row="0" x:Name="grdFormSearch" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <local:StudentUserControl HorizontalAlignment="Stretch" Height="100" VerticalAlignment="Stretch"/>
    </Grid>
</Grid>

上面我在view.xaml中添加了StudentUserControl

StudentUserControl.xaml.cs:

public partial class StudentUserControl : UserControl
{
   public StudentUserControl(StudentViewModel ViewModel)
   {
       InitializeComponent();
       this.DataContext = ViewModel;
   }
}

StudentViewModel.cs:

public StudentViewModel(IEventAggregator eventAggregator, IUnityContainer container)
{
     _eventAggregator = eventAggregator;
     _container = container;
}

它在xaml中抛出一个错误,因为它期望一个无参数的构造函数!

如何为DataContext设置UserControl? 这样做的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

从视图的构造函数中删除参数:

public partial class StudentUserControl : UserControl
{
    public StudentUserControl()
    {
        InitializeComponent();
    }
}

如果你想在XAML标记中创建一个视图实例,就不应该在那里,就像你在这里一样:

<local:StudentUserControl HorizontalAlignment="Stretch" Height="100" VerticalAlignment="Stretch"/>

此外,您不应该在代码隐藏中明确设置视图的DataContext。在大多数情况下,DataContext应该从父元素继承,即在您的情况下是view.xaml,如果在视图的构造函数中显式设置DataContext,则会破坏继承。

如果父视图由于某种原因没有DataContext,您可以使用Prism的视图模型定位器来创建视图模型:

<UserControl x:Class="WpfApplication1.StudentUserControl"
    ...
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True">

有关详细信息,请参阅以下链接:http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/

答案 1 :(得分:1)

您也可以在 view.xaml 中设置您的 DataContext

添加您的 viewModel 命名空间

xmlns:viewModel="using:YourApp.ViewModels"

然后在您的 xaml 标记中以这种方式设置

<UserControl.DataContext>
    <viewModel:StudentViewModel x:Name="ViewModel" />
</UserControl.DataContext>

您在视图中获得一个 ViewModel 属性,类型为 StudentViewModel