【问题标题】:Inject toolbar into another view将工具栏注入另一个视图
【发布时间】:2010-07-02 12:22:42
【问题描述】:

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

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

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

但是…… 我必须 1) 从容器中检索视图(所以不是 XAML!),以便为 messageBroker 提供 DI 2) 调用静态 IoC.Container.Resolve();内部构造函数

选项 2 破坏了 VS2010 设计器,因为容器未在设计模式下配置...

有什么想法吗? 视图在视图模型中不可见,我使用静态 ViewModelLocator。

【问题讨论】:

    标签: wpf mvvm mvvm-light


    【解决方案1】:

    如果需要从 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
        }
    }
    

    【讨论】:

    • 同意 - 我认为不应在视图中使用消息基础结构。使用接口和事件对我来说很有意义。
    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多