【问题标题】:WPF - MVVM Light, Ribbon Control, nested user controls/views and using events between user controls/viewsWPF - MVVM Light、Ribbon Control、嵌套用户控件/视图以及在用户控件/视图之间使用事件
【发布时间】:2015-11-25 10:40:19
【问题描述】:

我正在借助 MVVM light 和 Unity 构建一个 WPF 应用程序。 我在主窗体中有一个功能区控件,一个选项卡没有选项卡类别,一个选项卡类别中有两个选项卡。用户控件3包括用户控件2和用户控件1。

我希望在单击用户控件 2 时使选项卡类别和选项卡 2 和 3 可见,并在单击用户控件 3 或 1 时使它们不可见。 我对 mvvm 结构中的事件处理有点困惑。

我想使用 MVVM 规则正确执行此操作。你能给我一个例子或一些非常有用的指导吗?

Check how it looks like

【问题讨论】:

    标签: c# wpf xaml mvvm mvvm-light


    【解决方案1】:

    您的功能区或选项卡应由 ViewModel 备份,例如 TabCategoryViewModelTab2ViewModelTab3ViewModel。在这些 ViewModel 中注入 IMessanger 服务(如果尚未完成,当然要先注册它)并创建一个 POCO 事件消息,如 SelectedViewMessage

    public class SelectedViewMessage 
    {
        public string ViewName { get; set; }
    }
    

    在您的TabCategoryViewModel 中,您将注册以收听此消息

    public class TabCategoryViewModel : ViewModelBase
    {
        public readonly IMessanger messageService;
    
        public TabCategoryViewModel(IMessanger messageService) 
        {
            if(messageService == null) 
            {
                 throw ArgumentNullException("messageService");
            }
    
            this.messageService = messageService;
    
            this.messageService.Register<GoToPageMessage>(this, OnSelectedViewChanged);
        }
    
        protected void OnSelectedViewChanged(SelectedViewMessage message) 
        {
             this.IsVisible = message.ViewName == "UserControl2";
        }
    
        private bool isVisible;
        public bool IsVisible 
        {
            get { return isVisible; }
            set 
            {
                if(isVisible != value) 
                {
                    isVisible = value;
                    RaisePropertyChanged();
                }
            }
        }
    }
    

    您将相同的IMessanger 服务注入您用于绑定 UserControl2 并通过

    触发消息的 ViewModel
    var message = new SelectedViewMessage {
        ViewName = "UserControl2";
    };
    this.messangerService.Send<SelectedViewMessage>(message);
    

    此代码可以放在ViewSelectedCommand 或类似的东西中,您可以使用 Blend Interactivity Triggers/Actions 将其绑定到 View/UserControl 上的某些事件

    【讨论】:

      【解决方案2】:

      这可以通过在用户单击选项卡时添加事件onPropertyChange 并在 xaml 中的可见性标记下添加该属性来实现。另请查看Handling UI Control 以了解 xaml 中的映射,并了解来自Here 的事件处理 希望对您有所帮助。

      【讨论】:

      • 他现在明确要求通过尊重 MVVM 模式来解决它。事件处理违反了 MVVM 模式。 ViewModel 应与视图无关
      猜你喜欢
      • 2014-12-03
      • 2019-01-13
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多