如何使用 prism wpf 为用户控件设置数据上下文?
How to set data context for user control with prism wpf?
这是我的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
?
最好的方法是什么?
从视图的构造函数中删除参数:
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">
请参考以下link了解更多相关信息:http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/
您还可以在 view.xaml
中设置您的 DataContext
添加您的 viewModel 命名空间
xmlns:viewModel="using:YourApp.ViewModels"
然后在您的 xaml 标记中这样设置
<UserControl.DataContext>
<viewModel:StudentViewModel x:Name="ViewModel" />
</UserControl.DataContext>
您在您的视图中获得了一个类型为 StudentViewModel
的 ViewModel 属性
这是我的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
?
最好的方法是什么?
从视图的构造函数中删除参数:
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">
请参考以下link了解更多相关信息:http://brianlagunas.com/getting-started-prisms-new-viewmodellocator/
您还可以在 view.xaml
中设置您的 DataContext添加您的 viewModel 命名空间
xmlns:viewModel="using:YourApp.ViewModels"
然后在您的 xaml 标记中这样设置
<UserControl.DataContext>
<viewModel:StudentViewModel x:Name="ViewModel" />
</UserControl.DataContext>
您在您的视图中获得了一个类型为 StudentViewModel
的 ViewModel 属性