1

私は周りを見回しており、これに関する多くの情報をまだ見つけていません。私は PRISM プロジェクトをセットアップしましたが、これまでのところすべてが機能しているようです。モジュールのメイン クラス内で、プログラムでビューを作成しています。

私がやろうとしているのは、ビューの各インスタンスのビューモデルに送信されるオブジェクトを取得することです。現時点では、オブジェクトをビューコンストラクターに渡して、次のようなことをしようとしています:

   public MyView(IUnityContainer container, List<string> myDataObject)
    {
        InitializeComponent();

        MyViewViewModel vm = LayoutRoot.DataContext as MyViewViewModel;
        vm.DataObject = myDataObject;
    }

これにより、vm.DataObject の NullReferenceObject が発生します。この時点でビューモデルが適切にインスタンス化されていないと思います。

これをどのように行うべきかについて誰かが私を導くことができますか? ビューを介してデータオブジェクトを送信する必要がありますか?

御時間ありがとうございます

4

4 に答える 4

1

私が書いたサンプルアプリでは、ビューによって実装されるインターフェイスを作成しました。このインターフェイスには、SetViewModelという1つのメンバーがあります。このメソッドは、ViewModelであるオブジェクトを受け取ります。ViewModelは、コマンドをバインドおよび処理する場所をビューに提供します。

public interface IDemoView
{
    void SetViewModel(object viewModel);
}

実際のビューでのこのインターフェイスの実装は次のようになります。

public partial class DemoView : UserControl, IDemoView
{
    public DemoView()
    {
        InitializeComponent();
    }

    public void SetViewModel(object viewModel)
    {
        DataContext = viewModel;
    }
}

ビューのコンストラクターはデフォルトのままであり、コードビハインドに含まれるコードはこのSetViewModelメソッドのみです。

ViewModelクラスのコンストラクターでは、このメソッドを呼び出して、それ自体をビューに渡します。

public IDemoView View { get; private set; }
private IDemoModel _model;
public DemoViewModel( IDemoView view, IDemoModel model)
{            
    _model = model;            
    View = view;
    View.SetViewModel(this);
}

Moduleクラスのinitializeメソッドは、タイプをUnityContainerに登録し、領域にビューを追加します

public void Initialize()
{
    _container.RegisterType<IDemoView, DemoView>();
    _container.RegisterType<IDemoModel, DemoModel>();
    _container.RegisterType<IDemoViewModel, DemoViewModel>();

    var viewModel = _container.Resolve<IDemoViewModel>();

    _regionManager.Regions["MainRegion"].Add(viewModel.View);
}
于 2009-09-27T09:38:54.707 に答える
1

私たちのコードと私が見たすべてのビデオでは、ビューがパラメーターとして ViewModel を取るように設定しています。

    public ThisView(ThisVM vm)
    {
        InitializeComponent();
        DataContext = vm;
    }

他の場所から物を渡す必要がある場合は、eventAggregator を使用してサブスクライブおよびパブリッシュできます。
DataObject がある場所は次のようになります。

    _EventAggregator.GetEvent<PushModelEvent>().Subscribe(ReceiveModel, true);

そして、それにアクセスしたい場所(おそらくVM)のように:

    _EventAggregator.GetEvent<PushModelEvent>().Publish(_Model);

対処すべき同期処理がまだいくつかありますが、これが必要な場合は、これでうまくいくはずです。

于 2009-09-25T14:24:55.823 に答える
1

Unity コンテナーを使用しているため、それを使用してビューを介して DataContext オブジェクトを渡すことができます。RegisterInstanceDataContext を作成するときに使用しResolveてから、適切な各ビューで使用します。複数の DataContext がある場合は、名前付き登録を使用します。

于 2009-09-25T07:51:03.477 に答える
0

ビューとそのビューモデルを手動で作成し、関連するデータオブジェクトをビューモデルに設定してデータをバインドできるようにし、リージョンに追加する前に両方を結合する方法はありますか?

于 2009-09-25T12:50:28.127 に答える