我正在为我的新项目使用mvvm。我有一个消息调度程序在视图模型之间发送消息但在一种情况下我必须在视图中接收消息。 此视图包含一个工具栏面板,该面板必须包含与详细视图相关的工具栏(例如,编辑客户需要具有保存,撤消,重做,取消的工具栏。)
问题是我必须订阅视图中的消息才能写出:
broker.Subscribe<AddToolbarPanelMessage>(x=>toolbar.Add(x.Panel));
但是... 我必须 1)从容器中回溯视图(因此不是XAML!)以便为messageBroker获取DI 2)调用静态IoC.Container.Resolve();内部构造函数
选项2打破了VS2010设计器,因为容器未在设计模式下配置...
有什么想法吗? 从viewmodel看不到视图,我使用静态ViewModelLocator。
答案 0 :(得分: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);
}
}
您可以在视图中轻松处理该事件......
public partial class CustomerView : UserControl
{
public CustomerView()
{
InitializeComponent();
((ICustomerViewModel)this.DataContext).AddToolbarPanel += CreateToolbarPanel;
}
private void CreateToolbarPanel(object sender, EventArgs e)
{
// do your stuff
}
}