WPF - MVVM Light,Ribbon Control,嵌套用户控件/视图以及在用户控件/视图之间使用事件

时间:2015-11-25 10:40:19

标签: c# wpf xaml mvvm mvvm-light

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

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

我想用MVVM规则正确地做到这一点。你能给我一个例子或一些非常有用的指示怎么做?

Check how it looks like

2 个答案:

答案 0 :(得分: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上的某些事件

答案 1 :(得分:0)

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