你们中的任何一个Mvvm光奉献者如何处理以下情况。我有几个“主”ViewModels,它们使用自己的“子”ViewModel实例。即
子ViewModel - "OrderLineItemListViewModel“是一个按顺序排列的行项列表的视图模型。
父ViewModel - "OrderDetailViewModel“是订单的视图模型。父VIewModel - "OrderChargeViewModel“是一个用于收取订单费用的视图模型。
两个父ViewModels都需要一个OrderLineItems列表,并且都可以同时打开。目前,我已经设置父ViewModel包含子ViewModel类型的属性,然后可以引用它。
public class ChildViewModel
{
public ChildViewModel()
{
Items = new ObservableCollection<ListItemViewModel>
{
new ListItemViewModel("One"),
new ListItemViewMOdel("Two")
}
}
public ObservableCollection<ListItemViewModel> Items {get; private set;}
}
public class ParentViewModel
{
public ParentViewModel()
{
ChildViewModel = new ChildViewModel();
}
public ChildViewModel ChildViewModel {get; set;}
}
<Window>
<DataGrid ItemsSource={Binding ChildViewModel.Items} />
</Window>现在,我觉得应该有一种使用ViewModelLocator和消息传递的方法,但是我还没有找到一个干净的方法来做到这一点。我知道如何使用ViewModelLocator创建ViewModels的非单例实例,所以这很好。但是,我不知道如何让父ViewModel响应子ViewModel消息,并知道消息是否来自“其子ViewModel”,因此应该对其进行操作。
有人对如何处理这件事有任何建议,或者我应该继续这样做吗?让我思考的最大部分是现在,我有选择地使用ViewModelLocator,并且不确定这最终是否会是直观的。
发布于 2013-03-12 19:37:42
我不确定这个总数是否回答了你的问题,但我有一个像你这样的嵌套视图模型。我有一个父视图/视图模型,它有一个集合(在本例中是一个实体框架导航属性),我希望使用子视图/视图模型。这样就可以在没有消息传递的情况下进行“交互”。
因此,例如,如果您想将集合从父视图绑定到子视图模型中的组合框,您可以这样做(请注意父视图和子视图是用户控件,父视图中的内容控件绑定到子视图/视图模型):
<UserControl x:Class="EmployeeListView"
DataContext="{Binding EmployeeList_VM, Source={StaticResource Locator}}"/>
<ContentControl Name="DetailControl" DataContext="{Binding Path=Selection, Mode=TwoWay}" >
<ComboBox Name="cbStatus"
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=DataContext.EmployeeStatus}"
SelectedItem="{Binding ElementName=DetailControl, Path=DataContext.employee_status}"
SelectedValuePath="idStatus"
SelectedValue="{Binding idStatus, Mode=TwoWay, ValidatesOnDataErrors=True}"
DisplayMemberPath="chrCode"/>
</ContentControl>
</UserControl>我试着使它尽可能简单。请注意,项目源绑定到祖先用户控制数据文本,其中包含我要绑定的集合(EmployeeStatus)。这样,您的子视图模型就可以与父VM集合/对象进行交互,而无需使用消息传递。否则,我使用消息传递来针对特定的视图模型,如果这是您要寻找的,但是我认为上面的内容可能更简单。
编辑:在回应您的评论时,我认为这里的挑战是您想要解耦您的父/子视图模型,但同时您希望能够分辨哪些是“配对”的。因此,IMHO的方法是创建某种类型的标志/标识符,在父视图模型和子视图模型上具有匹配的属性。我将在父视图模型的conrtuctor中设置此属性,并为子视图模型设置第二个构造函数,该构造函数在其构造函数中接受此标识符并设置该属性。然后,我将使用信使以父类的viewmodel类型为目标,并将标识符作为消息的参数传递。然后,我将在父视图模型中注册信使,以“侦听”针对其“类型”的消息,并检查标识符标志/参数是否与父视图模型中的标识符/参数匹配。
通过为子视图模型设置两个构造函数,这将允许您在其他地方仍然使用子视图模型,而不会直接依赖父视图模型的属性类型,从而避免将它们耦合在一起。
我希望这是合理的。您说您熟悉信使,所以我没有发布一个示例说明如何针对某个类型并向消息中添加参数,但如果您愿意,我可以这样做。
希望这能有所帮助。
https://stackoverflow.com/questions/15369772
复制相似问题