WPF控件 - 应该尽量避免使用代码后台吗?

7
我有一个WPF项目,需要创建一个控件,该控件特定于领域,但将在多个视图中重复使用。
该控件必须显示一个十进制值的3部分,即整数部分和小数部分分为2部分,具有不同的字体大小。我有一个依赖属性来表示金额,然后在代码后台将金额分成3部分,以便可以在具体标签中显示它们。我还使用十进制金额来判断金额是上升还是下降,并随后更改控件的背景颜色。所有这些都在代码后台完成。我知道有人说代码后台是邪恶的,我在大多数情况下也同意。但是,否则你会如何实现这一点?

“小数部分拆分为两个不同字体大小的部分” - 你能进一步解释一下吗? - goobering
1
这只是一个细节,对问题并没有实质性影响。想象一下,我需要在前面显示前三个小数位,并在后面显示其余部分的字体大小为8。 - Claudio Cauchi
2个回答

13
不,不必以任何代价避免使用代码后台。
请记住:数据是数据,UI是UI
例如,如果您的代码仅涉及UI,则在代码后面没有问题。
与实际数据相关的任何内容,包括与ViewModel一起工作的内容,通常应该避免在代码后台中出现,因为这样会创建依赖项,从而破坏MVVM设计模式。
因此,更直接地回答您的问题,您所做的一切都没有问题。 编辑 让我进一步解释。
想象一下,您有一个视图,其中一个按钮需要在单击后启动Storyboard。(当然,您可以仅在XAML中执行此操作,但这只是一个示例)
在这种情况下,向按钮添加单击事件并从代码后台启动Storyboard没有问题。这是仅限UI代码,因此很安全。
但是,假设您的按钮在单击时需要更改ViewModel中的属性。您不应在代码后台获取DataContext。您将需要使用Command,因为您需要保持ViewViewModel分离。
有一种看法认为,如果您的视图具有代码后台,那么您应该被带到后面,以颈部注射或枪决的方式处决。这是不正确的。
总之,MVVM是一种模式,而不是法律。

同意。我只保留执行权限给那些在可以选择WPF时仍然选择使用Windows Forms的人。 - Falanwe
我完全同意这个理念。然而,有些人声称所有可以在代码后面完成的工作都可以在XAML中完成(比如你的故事板示例)。是否有一些XAML结构可以帮助完成上述工作? - Claudio Cauchi
@Klaws86 并不是所有的问题都有 XAML 解决方案,我可以很自信地说你所需的没有 XAML 解决方案。代码后台存在的原因是有它的道理的,虽然仅使用 XAML 看起来非常专业,但有时候实现不了,这并不是一件坏事。帮助你创建一个满足你要求的控件已经超出了你的问题范围,如果你卡住了,最好提一个新问题。 - Mike Eason

0

不要在 Code Behind 中将 Amount 分成 3 部分,您可以在 ViewModel 中保留一个 Property Amount,并使用带有 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}"

如果您需要在实现过程中进一步的帮助或者有任何疑问,请告诉我。


谢谢您的回复,不过我需要Amount值和它之前的值才能在控件上执行字体逻辑,所以这只能解决问题的一半。 - Claudio Cauchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接