2

你们中的任何一个 Mvvm Light Devotes 如何处理以下情况。我有几个使用自己的“子”视图模型实例的“主”视图模型。IE

Child ViewModel - "OrderLineItemListViewModel" 一个视图模型,用于订单中的行项目列表。

Parent ViewModel - "OrderDetailViewModel" 订单的视图模型。Parent VIewModel - "OrderChargeViewModel" 用于收取订单费用的视图模型。

两个父 ViewModel 都需要有一个 OrderLineItem 列表,并且两者都可以同时打开。目前,我已设置父 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 和 Messaging 来做到这一点,但是我还没有找到一个干净的方法来做到这一点。我知道如何使用 ViewModelLocator 创建 ViewModel 的非单例实例,所以这很好。但是,我不知道如何让父 ViewModel 响应子 ViewModel 消息并知道消息是否来自“它的”子 ViewModel,因此应该采取行动。

任何人都对如何处理这个问题有任何建议,或者我应该继续按照我的方式去做吗?让我思考的最大部分是,现在,我有选择地使用 ViewModelLocator,但不确定最终是否会直观。

4

1 回答 1

1

我不确定这个总数是否能回答你的问题,但我所拥有的是一个像你这样的嵌套视图模型。我有一个父视图/视图模型,它有一个集合(在本例中为实体框架导航属性),我希望子视图/视图模型与之交互。这样就可以在没有消息的情况下进行“交互”。

因此,例如,如果您想将集合从父视图绑定到子视图模型中的组合框,您可以这样做(请注意,父视图和子视图是用户控件,并且在父视图中,内容控件绑定到子视图/视图模型):

<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>

我试图让它尽可能简单。请注意 itemsource 绑定到包含我绑定到的集合 (EmployeeStatus) 的祖先用户控件数据上下文。这样,您的子视图模型可以与您的父 VM 集合/对象进行交互,而无需使用消息传递。否则,如果您正在寻找特定的视图模型,我会使用消息传递来定位特定的视图模型,但我认为上述内容可能更简单。

编辑: 针对您的评论,我认为这里的挑战是您想要分离您的父/子视图模型,但同时您希望能够分辨哪些是“配对”的。所以恕我直言,这样做的方法是创建某种类型的标志/标识符,在父视图模型和子视图模型上具有匹配的属性。我将在父视图模型的构造函数中设置此属性,并为子视图模型设置第二个构造函数,该构造函数在其构造函数中接受此标识符并设置该属性。然后我会使用信使来定位父视图模型类型并将标识符作为消息的参数传递。然后我会在父视图模型中注册信使以“侦听”针对其“类型”的消息

通过为子视图模型提供两个构造函数,这将允许您仍然在其他地方使用子视图模型,并且不会直接依赖于父视图模型的属性类型,从而避免将它们耦合在一起。

我希望这是有道理的。您说您熟悉信使,所以我没有发布如何定位类型并向消息添加参数的示例,但如果您愿意,我可以。

希望这可以帮助。

于 2013-03-12T19:37:42.790 回答