2

我试图在一个小型测试 WPF 应用程序中了解 Caliburn.Micro 和 MVVM。

我有一个自定义用户控件,它有一个支付组合框(带有现金、支票、信用),在这个组合框旁边,我想根据所选的支付类型加载适当的数据输入视图。例如,如果用户选择现金,也许我只加载带有金额文本字段的视图,但如果用户选择信用,我将加载带有金额、信用卡类型、信用卡号等字段的视图。

Caliburn.Micro 能以任何方式帮助解决这个问题吗?我一直想知道这是否是 Caliburn.Micro 中内置的屏幕和导体功能的用例,但我不确定。如果 Caliburn 可以提供帮助,那么视图模型层次结构应该支持什么?我可以看到有一个 PaymentViewModel 包含一个 PaymentTypeViewModel 的实例,但我不确定如何促进 PaymentTypeViewModel 实例的切换,该实例将以某种方式基于组合框中的当前选择以及加载关联的视图对于该视图模型。

非常感谢您提供的任何建议。

4

1 回答 1

3

有几种方法可以做到这一点,但使用 CaliburnConductorScreen类型是最有意义的。我想一个问题是,一旦您从用户那里检索到这些数据,您将如何处理它?当您在不同屏幕上从用户那里检索更多信息时,它会被持久化还是临时存储为应用程序状态?

无论哪种方式,使用单个屏幕导体 ( ) 都是有意义的Conductor<T>,它将保存对三种类型的支付检索屏幕中的每一种的引用。为每个支付屏幕创建一个视图模型和视图,实例化并存储对每个支付屏幕的引用Conductor(或者更好地将这些作为依赖项注入到您的导体的构造函数中,或者注入一个实例化它们的工厂类型)。

通过约定,如果调用组合框,您的组合框Payment将自动将所选值绑定到SelectedPayment导体上的属性。在此属性的设置器中,您可以ActivateItem根据 的值调用适当的支付视图模型引用上的方法SelectedPayment

据推测,您的指挥器上会有一个“确定”或类似的按钮,它可以从当前活动的模型中检索数据 ( ActiveItem)。每个支付视图模型都可以实现一个接口,例如一个GetPaymentDetails方法,也许这可以返回一个准备好被持久化的细节的序列化形式。

还应该在您的指挥视图中提及(假设它称为 ShellView.xaml),您可以使用 aContentControl来显示当前的支付视图模型(并让 Caliburn 注入适当的视图并进行绑定),它被引用为ActiveItem

<ContentControl x:Name="ActiveItem" />

请注意,您可能有点花哨,并为您的组合框命名(有点模棱两可)Items,并将其绑定ItemsSource到您的付款视图模型的集合,该Items集合可以是Conductor<T>.Collection.OneActive. Caliburn 会自动将选定的值(支付视图模型)绑定到ActiveItem您的导体上的属性,因此当您更改组合框值时,您的当前视图将自动切换。

于 2011-03-29T21:40:22.167 回答