WPF-MVVM Light、功能区控件、嵌套的用户控件/视图以及在用户控件/查看之间使用事件

本文关键字:控件 用户 事件 之间 视图 功能区 Light 嵌套 WPF-MVVM | 更新日期: 2023-09-27 18:24:32

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

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

我希望使用MVVM规则正确地执行此操作。你能给我举个例子或一些真正有用的指导吗?

检查的外观

WPF-MVVM Light、功能区控件、嵌套的用户控件/视图以及在用户控件/查看之间使用事件

您的功能区或选项卡应该由ViewModel备份,比如TabCategoryViewModelTab2ViewModelTab3ViewModel。在这些ViewModels中,您注入了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();
            }
        }
    }
}

您将用于绑定UserControl2的IMessanger服务注入到ViewModel中,并通过激发消息

var message = new SelectedViewMessage {
    ViewName = "UserControl2";
};
this.messangerService.Send<SelectedViewMessage>(message);

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

这可以通过在用户单击选项卡时添加事件onPropertyChange并在xaml中的Visibility标记下添加该属性来实现。另请参阅Handling UI Control以了解xaml中的映射,并从这里了解事件处理希望能有所帮助。