C# WPF-MVVM灯光、功能区控件、嵌套用户控件/视图以及在用户控件/视图之间使用事件

C# WPF-MVVM灯光、功能区控件、嵌套用户控件/视图以及在用户控件/视图之间使用事件,c#,wpf,xaml,mvvm,mvvm-light,C#,Wpf,Xaml,Mvvm,Mvvm Light,我正在MVVM light和Unity的帮助下构建一个WPF应用程序。 我在主窗体中有一个功能区控件,一个选项卡没有选项卡类别,一个选项卡类别中有两个选项卡。用户控件3包括用户控件2和用户控件1 我希望在单击用户控件2时使选项卡类别以及选项卡2和3可见,并在单击用户控件3或1时使它们不可见。 我对mvvm结构中的事件处理有点混淆 我想用MVVM规则正确地完成这项工作。你能给我举个例子或者一些真正有用的指导吗 这可以通过在用户单击选项卡时添加事件并在xaml的可见性标记下添加该属性来实现。另外,请

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

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

我想用MVVM规则正确地完成这项工作。你能给我举个例子或者一些真正有用的指导吗


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

您的功能区或选项卡应该由ViewModel进行备份,比如说
TabCategoryViewModel
Tab2ViewModel
Tab3ViewModel
。在这些ViewModels中,您可以插入
IMessanger
服务(当然,如果尚未注册,请先注册),并创建POCO事件消息,如
SelectedViewMessage

public class SelectedViewMessage 
{
    public string ViewName { get; set; }
}
在您的
选项卡CategoryViewModel
中,您将注册以收听此消息

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();
            }
        }
    }
}

此代码可以放在
ViewSelectedCommand
或类似命令中,您可以使用混合交互触发器/操作将其绑定到视图/用户控件上的特定事件

他现在明确要求通过尊重MVVM模式来解决此问题。事件处理违反了MVVM模式。ViewModel应是视图不可知的
var message = new SelectedViewMessage {
    ViewName = "UserControl2";
};
this.messangerService.Send<SelectedViewMessage>(message);