0

我有一个具有简单 MVC 架构的应用程序(桌面,不是 web 或 .net),可以通过简单的绑定机制从模型中显示值和值列表。

该模型是一个树结构的标量和数组节点。一些节点是原始值,一些具有成员子节点的对象。

视图级绑定语法类似于:

app_root.some_node.prices[1]  // single "price" object 
app_root.some_node.prices     // all "price" objects 

现在,我需要在通过某种转换过程运行它们之后呈现这些值。

例如:实时货币转换。即比格式化更复杂的东西,可能会失败或在某种程度上依赖于应用程序状态。

如何在保持 MVC 系统和绑定语法健全的同时添加此功能?

我能想到的两个直接选择是:

// Fake "arguments" to a generic app-level converter node?
//
// Very hack-ish looking and now the app has a new 
// global "currency_converter" node.
//
app_root.currency_converter.euro.app_root.some_node.prices[1]
app_root.currency_converter.yen.app_root.some_node.prices[1]

// Ad-hoc extension to the "price" objects?
//
// Cleaner binding path, but now I need modify the "price" object for
// each new currency.  This also seems wrong.
//
app_root.some_node.prices[1].asEuro
app_root.some_node.prices[1].asYen // etc.

// Adding a post-fix converter option? 
//
// Still a cleaner binding path, but now there must exist some magic 
// conversion system/registry that the "As" sub-node must know how to talk to.
// 
app_root.some_node.prices[1].As.Euro
app_root.some_node.prices[1].As.Yen // etc.

有没有更好的办法?

4

1 回答 1

0

我会选择第二个选项,因为第一个选项会导致转换器膨胀,你最终会得到很多你必须管理的转换器。

我不知道您在哪个平台或技术上工作,但有时看看其他人是如何做到的会很有帮助,我使用的是 Microsoft 的桌面应用程序堆栈 WPF,他们有一个可以使用如下格式的绑定对象:

<Label Content={Binding Path=CurrentAmount, Format=Cost: {0:C}} />
                                            ^^^^^^^^^^^^^^^^^^

Binding是这里的一个对象,并且Format是它的参数之一Path,所以也许你可以在你的框架中实现类似的东西。

编辑:我向您展示了 WPF 如何执行简单格式化,但系统还具有进行更复杂转换的能力,并且可以以与格式化相同的方式应用它。

这是之前的相同示例,但这次添加了转换:

<Label Content={Binding Path=CurrentAmount, Format=Cost: {0:C}, Converter=myConverter />
                                                                ^^^^^^^^^^^^^^^^^^^^^

如您所见,您也可以使用转换器参数,myConverter 实际上是一个实现 WPF 接口的类,该接口IValueConverter可以将值从视图层来回转换到模型,反之亦然。

于 2013-07-26T10:55:21.590 回答