我正在借助 MVVM light 和Unity构建 WPF 应用程序。 我在主窗体中有一个功能区控件,一个选项卡没有选项卡类别,另一个选项卡位于选项卡类别中。用户控件3包括用户控件2和用户控件1。
当我在用户控件2中单击时,我想使选项卡类别和选项卡2和3可见,并在单击用户控件3或1时使它们不可见。 我对mvvm结构中的事件处理感到困惑。
我想用MVVM规则正确地做到这一点。你能给我一个例子或一些非常有用的指示怎么做?
答案 0 :(得分:1)
您的功能区或标签应该由ViewModel备份,让我们说TabCategoryViewModel
或Tab2ViewModel
和Tab3ViewModel
。在这些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中的事件处理 希望它有所帮助。