2

我试图在 PRISM 模块上使用 MVVM。我的模块中有一个带有参数化构造函数的 ViewModel,它接受将使用 Ninject 注入的 IOutputService 对象。

namespace HelloWorld.ViewModels
{
    public class HelloWorldViewModel : ViewModelBase
    {
        private IOutputService outputService;

        public HelloWorldViewModel(IOutputService outputService)
        {
            this.outputService = outputService;
        }
    }
}

在 HelloWorldModule.cs 文件中,我将 IOutputService 注册到一个实现它的类。

public class HelloWorldModule : IModule
{
    private IKernel kernel;
    private IRegionManager regionManager;

    public HelloWorldModule(IKernel kernel, IRegionManager regionManager)
    {
        this.kernel = kernel;
        this.regionManager = regionManager;
    }

    public void Initialize()
    {
        kernel.Bind<IOutputService>().To<MessageBoxOutputService>();
        regionManager.RegisterViewWithRegion("Region1", typeof(HelloWorldView));
    }
}

您还可以注意到我正在将 HelloWorldView 注册到 Region1。HelloWorldView 使用 HelloWorldViewModel。现在的问题是我无法在 View 的 XAML 中初始化 HelloWorldViewModel,因为我的 ViewModel 没有无参数构造函数。

<UserControl x:Class="HelloWorld.Views.HelloWorldView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:vm="clr-namespace:HelloWorld.ViewModels"
             mc:Ignorable="d">
    <UserControl.DataContext>
        <vm:HelloWorldViewModel />
    </UserControl.DataContext>
    <Grid>

    </Grid>
</UserControl>

当我运行它时,视图的 InitializeComponent() 方法会引发 NullReferenceException。有什么合适的方法来完成这项工作吗?谢谢。

4

3 回答 3

0

在视图的代码隐藏中,在构造函数中注入视图模型。

public partial class HelloWorldView : UserControl
{
    public HelloWorldView(HelloWorldViewModel vm)
    {
        InitializeComponent();
        DataContext = vm;
    }
 }
于 2012-09-04T22:18:08.057 回答
0

好吧,您不必在 xaml 中设置 View 的 DataContext。它可以简单地在 CodeBehind 中完成。将以下属性添加到 HelloWorldView.xaml.cs

    /// <summary>
    /// Gets or sets ViewModel.
    /// </summary>
    [Inject]
    public HelloWorldViewModel ViewModel
    {
        get { return this.DataContext as HelloWorldViewModel; }
        set { this.DataContext = value; }
    }

当您调用 RegisterViewWithRegion 时,将解析该视图的一个实例,并且由于 InjectAttribute,Ninject 将为该视图提供 DataContext。所以你不必担心这个。构造函数注入也应该起作用。

于 2012-12-19T23:35:39.840 回答
-1

尝试使用ObjectDataProvider

示例(来自 MSDN):

<ObjectDataProvider x:Key="myDataSource" ObjectType="{x:Type src:Person}">
  <ObjectDataProvider.ConstructorParameters>
    <system:String>Joe</system:String>
  </ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>

这是Bea Stollnitz的一个很好的例子:

为什么要使用 ObjectDataProvider?

于 2012-08-11T05:25:50.583 回答