0

我正在为我的新项目使用 mvvm。我有一个消息调度程序在视图模型之间发送消息,但在一种情况下,我必须在视图中接收消息。此视图包含一个工具栏面板,该面板必须包含与详细视图相关的工具栏(例如编辑客户需要一个带有保存、撤消、重做、取消的工具栏)。

问题是我必须订阅视图内的消息才能编写:

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

但是......我必须 1)从容器中检索视图(所以不是 XAML!)以便为 messageBroker 提供 DI 2)调用静态 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 回答