我正在借助MVVM light和Unity构建WPF应用程序。我在主窗体中有一个功能区控件,其中一个选项卡没有选项卡类别,两个选项卡在一个选项卡类别中。用户控件3包括用户控件2和用户控件1。
我想在用户控件2中单击时使选项卡类别和选项卡2和3可见,在用户控件3或1中单击时使它们不可见。我对mvvm结构中的事件处理有点混淆。
我希望使用MVVM规则正确地执行此操作。你能给我举个例子或一些真正有用的指导吗?
检查的外观
您的功能区或选项卡应该由ViewModel备份,比如TabCategoryViewModel
或Tab2ViewModel
和Tab3ViewModel
。在这些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中的映射,并从这里了解事件处理希望能有所帮助。