0

新しいプロジェクトに mvvm を使用しています。ビューモデル間でメッセージを送信するためのメッセージ ディスパッチャがありますが、あるケースではビューでメッセージを受信する必要があります。このビューには、詳細ビューに関連するツールバーを含む必要があるツールバー パネルが含まれています (たとえば、顧客の編集には、保存、元に戻す、やり直し、キャンセルを含むツールバーが必要です)。

問題は、これを書くことができるようにするには、ビュー内のメッセージを購読する必要があることです:

broker.Subscribe<AddToolbarPanelMessage>(x=>toolbar.Add(x.Panel));

しかし... 1) messageBroker の DI を取得するために、コンテナー (XAML ではない!) からビューを取得する必要があります。2) static IoC.Container.Resolve(); を呼び出します。コンストラクター内

オプション 2 は、コンテナーがデザイン モードで構成されていないため、VS2010 デザイナーを壊しました...

何か案が?ビューはビューモデルからは見えません。静的な ViewModelLocator を使用します。

4

1 に答える 1

0

ViewModel から View に通信する必要がある場合は、ViewModel のインターフェイスでイベントを作成し、View にそのイベントを処理させます。ViewModel は AddToolbarPanelMessage をサブスクライブし、ビューが処理するイベントを発生させることができます。

public interface ICustomerViewModel
{
    event EventHandler AddToolbarPanel;
}

public class CustomerViewModel : ViewModelBase, ICustomerViewModel
{
    public event EventHandler AddToolbarPanel;

    public CustomerViewModel(IMessenger broker) : base(broker)
    {
        broker.Subscribe<AddToolbarPanelMessage>(
        MessengerInstance.Register<AddToolbarMessage>(this, AddToolbarMessageReceived);
    }
    private void AddToolbarMessageReceived(AddToolbarMessage msg)
    {
        var eh = AddToolbarPanel;
        if (eh != null)
            eh.Invoke(this, EventArgs.Empty);
    }
}

ビューのctorでイベントを簡単に処理できます...

public partial class CustomerView : UserControl
{
    public CustomerView()
    {
        InitializeComponent();
        ((ICustomerViewModel)this.DataContext).AddToolbarPanel += CreateToolbarPanel;
    }
    private void CreateToolbarPanel(object sender, EventArgs e)
    {
        // do your stuff
    }
}
于 2010-07-02T16:17:31.017 に答える