代码之家  ›  专栏  ›  技术社区  ›  Mauro Destro

将工具栏插入到另一个视图中

  •  0
  • Mauro Destro  · 技术社区  · 16 年前

    此视图包含一个工具栏面板,该面板必须包含与“详细信息”视图相关的工具栏(例如,编辑客户需要一个带有“保存”、“撤消”、“重做”和“取消”的工具栏)。

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

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

    我必须这么做 1) 从容器中检索视图(所以不是XAML!)为了让messageBroker有DI 2) 调用静态IoC.Container.Resolve();内部构造函数

    选项2中断了VS2010设计器,因为未在设计模式下配置容器。。。

    视图在viewmodel中不可见,我使用静态ViewModelLocator。

    1 回复  |  直到 16 年前
        1
  •  0
  •   Matt Casto    16 年前

    在需要从ViewModel到视图进行通信的情况下,我会在ViewModel的界面中创建一个事件,并让视图处理该事件。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
        }
    }