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

WPF Controls - Should code behind be avoided at all costs?

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

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

不,不应该不惜一切代价

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

例如,如果您的代码 UI 东西,那么隐藏代码并没有错。

任何与实际数据一起工作的东西,包括与 ViewModel 一起工作的东西,通常都应该在代码隐藏中避免,因为你会创建依赖关系,中断 MVVM 设计模式。

所以更直接地回答你的问题,你所做的没有任何问题。

编辑

让我进一步解释。

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

在这种情况下,向按钮添加单击事件并从代码隐藏启动故事板没有任何问题。这只是 UI 代码,所以它是安全的。

但是,假设您的按钮在被单击时需要更改 ViewModel 中的 属性。您不应该 获取代码隐藏中的DataContext。您将需要使用 Command,因为您需要将 ViewViewModel.

分开

有一个耻辱,如果你的观点有代码隐藏,那么你应该被带回去并在后脑勺上开枪,执行风格。这是不正确的。

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

您可以在 ViewModel 中保留一个 属性 Amount,而不是在 Code Behind 中将 Amount 分成 3 个,并使用具有 3 个参数的 Converter 来提取三个信息之一以供显示。所以你可以有 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}"

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