我有TabControl
和Button
的视图。我的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也可以吗?
答案 0 :(得分:1)
整个观点模型是分开关注点。
回答你的问题:
我在家中使用和感受的最常见方法是使用公共消息总线。你拿一个例如构造函数中的IMessenger
然后可以使用它来推送视图模型中发生的事件,而任何其他感兴趣的视图模型(在您的情况下,您的主视图模型)都可以订阅这些事件。
根据您使用的库,可能已经实现了基本的发布/订阅消息总线(例如PRISM或MVVMLight)。我将很快发布一些链接。
当然,请选择较小的视图模型。如果您正在测试,那么测试较小的视图模型会更容易,并且更容易让下一个人出现并了解较小的视图模型应该做什么,而不是所有视图模型的母亲! SOLID的一部分是Single Responsibility Principal,它在维护和/或测试方面非常有用。