应该如何根据MVVM传递子ViewModel和主ViewModel?

时间:2016-04-15 20:03:23

标签: c# wpf mvvm mvvm-light

我有TabControlButton的视图。我的ViewModel开始快速增长,所以我决定将它分成几个View TabItem的ViewModel。我希望我的Button IsEnabled属性取决于是否在第一个TabItem中选中了任何复选框。 所以我的问题是子ViewModel应该如何与主ViewModel通信。这是我的View代码:

<TabControl>
    <TabItem DataContext="{Binding TabItem1ViewModel}">
        <ListBox ItemSource="{Binding Items}>
            <ListBoxt.ItemTemplate>
                <DataTemplate>
                   <Checkbox IsChecked="{Binding IsChecked}" Text="{Binding Text}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="SelectionChanged">
                    <command:EventToCommand Command="{Binding SelectionChangedCommand}"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </ListBox>
    </TabItem>
    //...... Another TabItems
</TabControl>

<Button IsEnabled="{Binding IsAnythingChecked}" Content=""/>  

for ViewModel:

MainViewModel:BaseViewModel
{
   public TabItem1ViewModel TabItem1ViewModel {get;set;}

   public bool IsAnythingChecked 
   {
      get
      {
          return TabItem1ViewModel.Items.Any(x=>x.IsChecked);
      }
   }
}

TabItem1ViewModel:BaseViewModel
{
   public TabItem1ViewModel()
   {
      SelectionChangedCommand = new RelayCommand(selectionChanged);
   }

   public Model Items {get;set;}

   public ICommand SelectionChangedCommand {get;set;}

   private void selectionChanged()
   {
       //...
       //Some logic here
       //...
       //And I want to update IsAnythingChecked property of MainViewModel what is the best way to do it?
   }
}

代表型号:

class Model:INotifyPropertyChanged
{
   public bool IsChecked { get;set; }

   public string Text { get; set; }
}

另外,将ViewModel拆分为较小的或者胖的ViewModel也可以吗?

1 个答案:

答案 0 :(得分:1)

整个观点模型是分开关注点。

回答你的问题:

1。应该如何根据MVVM传递子ViewModel和主ViewModel?

我在家中使用和感受的最常见方法是使用公共消息总线。你拿一个例如构造函数中的IMessenger然后可以使用它来推送视图模型中发生的事件,而任何其他感兴趣的视图模型(在您的情况下,您的主视图模型)都可以订阅这些事件。

根据您使用的库,可能已经实现了基本的发布/订阅消息总线(例如PRISM或MVVMLight)。我将很快发布一些链接。

2。将ViewModel拆分为较小的或胖的ViewModel也可以是

当然,请选择较小的视图模型。如果您正在测试,那么测试较小的视图模型会更容易,并且更容易让下一个人出现并了解较小的视图模型应该做什么,而不是所有视图模型的母亲! SOLID的一部分是Single Responsibility Principal,它在维护和/或测试方面非常有用。