WPF 控件 - 应不惜一切代价避免使用代码

本文关键字:代码 代价 控件 不惜一切 WPF | 更新日期: 2023-09-27 17:55:53

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

控件必须显示 3 个部分的十进制值,整数部分和小数部分拆分为 2 个,具有不同的字体大小。我有一个 Amount 的依赖属性,然后在后面的代码中将金额分成 3 个部分,以便我可以在特定标签中显示它们。我还使用十进制金额来确定金额是上升还是下降,并随后更改控件的背景颜色。所有这些都是在隐藏的代码中完成的。我知道有人说背后的代码是邪恶的,在大多数情况下我同意。但是,否则您将如何实现这一点?

WPF 控件 - 应不惜一切代价避免使用代码

不,不应该不惜一切代价避免它。

请记住,数据就是数据,UI 就是 UI。

例如,如果你的代码做UI的事情,那么隐藏代码并没有错。

通常应避免在代码隐藏中使用任何处理实际数据的内容,包括使用ViewModel,因为随后将创建依赖项,这会破坏 MVVM 设计模式。

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

编辑

让我进一步解释。

想象一下场景,你有一个视图,有一个按钮,当它被单击时需要启动Storyboard。(当然,您只能在 XAML 中执行此操作,但这只是一个示例)

在这种情况下,向按钮添加单击事件并从代码隐藏启动情节提要并没有错。这是仅 UI 代码,因此很安全。

但是,假设您的按钮在单击时需要更改 ViewModel 中的属性。您不应掌握代码隐藏中的DataContext。您将需要使用Command因为您需要将视图视图模型分开。

有一种耻辱感是,如果你的观点有代码隐藏,那么你应该被带回去,在后脑勺,执行风格。这是不真实的。

综上所述,MVVM 是一种模式,而不是法律。

您可以在 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}"

如果您在实施它时需要任何进一步的帮助,或者不清楚,请告诉我。