WPF控制 - 是否应该不惜一切代价避免代码?

时间:2015-06-12 14:20:06

标签: c# wpf .net-4.5

我有一个WPF项目,需要创建一个特定于域的控件,但是会在多个视图中重用。

控件必须以3个部分显示小数值,整数部分和小数部分分成2个不同的字体大小。我有一个Amount的依赖属性,然后在后面的代码中分成3个部分的数量,所以我可以在特定的标签中显示它们。我还使用小数量来决定金额是上升还是下降,然后更改控件的背景颜色。所有这些都是在后面的代码中完成的。我知道有人说背后的代码是邪恶的,我在大多数情况下都同意。但是你会如何实现呢?

2 个答案:

答案 0 :(得分:12)

不,所有费用都不应该避免。

请记住,数据是数据,用户界面是用户界面

例如,如果您的代码只有 UI内容,那么代码背后没有任何问题。

在代码隐藏中通常应避免使用任何适用于实际数据的内容,包括使用ViewModel,因为您将创建依赖项,打破 MVVM设计模式。

因此,为了更直接地回答您的问题,您所做的事情并没有任何问题。

修改

让我进一步解释。

想象一下场景,你有一个视图,一个按钮需要在点击时启动Storyboard。 (当然,你只能在XAML中这样做,但这只是一个例子)

在这种情况下,将click事件添加到按钮并从代码隐藏中启动故事板没有任何问题。这是仅限用户界面代码,因此非常安全。

但是,我们假设您的按钮需要在点击时更改 ViewModel 中的属性。您不应该抓住代码隐藏中的DataContext。您需要使用Command,因为您需要将查看 ViewModel 分开。

如果你的观点有代码隐藏的话,那就是一个耻辱,那么你应该被带回去并在头脑后面执行。这是不真实的。

所有这一切,MVVM是模式,而不是法律。

答案 1 :(得分:0)

您可以在ViewModel中保留一个属性数量,并使用带有3个参数的转换器来提取显示的三个信息之一,而不是在代码隐藏中拆分3个数量。所以你可以有这样的3个绑定:

"{Binding Amount, Mode=TwoWay, Converter={StaticResource AmountSplitterConverter},ConverterParameter=Integral}"

"{Binding Amount, Mode=TwoWay, Converter={StaticResource AmountSplitterConverter},ConverterParameter=Decimal1}"

"{Binding Amount, Mode=TwoWay, Converter={StaticResource AmountSplitterConverter},ConverterParameter=Decimal2}"

如果您在实施方面需要任何进一步的帮助,或者情况不明确,请与我们联系。