2

PRISM モジュールで MVVM を使用しようとしています。私のモジュールには、Ninject を使用して注入される IOutputService オブジェクトを受け入れるパラメーター化されたコンストラクターを持つ ViewModel があります。

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 を使用します。現在の問題は、ViewModel にパラメーターなしのコンストラクターがないため、View の XAML で HelloWorldViewModel を初期化できないことです。

<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>

これを実行すると、View の InitializeComponent() メソッドが NullReferenceException をスローします。これを機能させる適切な方法はありますか?ありがとう。

4

3 に答える 3

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 に答える
0

ビューの分離コードで、ビューモデルをコンストラクターに挿入します。

public partial class HelloWorldView : UserControl
{
    public HelloWorldView(HelloWorldViewModel vm)
    {
        InitializeComponent();
        DataContext = vm;
    }
 }
于 2012-09-04T22:18:08.057 に答える
-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 に答える