WPF 控件 - 是否应该不惜一切代价避免代码隐藏?
WPF Controls - Should code behind be avoided at all costs?
我有一个 WPF 项目,需要创建一个特定于域但将在多个视图中重复使用的控件。
控件必须分三部分显示小数值,整数部分和小数部分分成两部分,字体大小不同。我对金额有依赖性 属性,然后在后面的代码中将金额分成 3 部分,以便我可以在特定标签中显示它们。我还使用小数来决定金额是上升还是下降,然后更改控件的背景颜色。所有这些都是在后面的代码中完成的。我知道有人说代码隐藏是邪恶的,在大多数情况下我都同意。但是,否则您将如何实施?
不,不应该不惜一切代价。
记住,数据就是数据,UI就是UI。
例如,如果您的代码 仅 UI 东西,那么隐藏代码并没有错。
任何与实际数据一起工作的东西,包括与 ViewModel
一起工作的东西,通常都应该在代码隐藏中避免,因为你会创建依赖关系,中断 MVVM 设计模式。
所以更直接地回答你的问题,你所做的没有任何问题。
编辑
让我进一步解释。
想象一下场景,您有一个视图,其中一个按钮需要在单击后启动 Storyboard
。 (当然,你只能在XAML中这样做,但这只是一个例子)
在这种情况下,向按钮添加单击事件并从代码隐藏启动故事板没有任何问题。这只是 UI 代码,所以它是安全的。
但是,假设您的按钮在被单击时需要更改 ViewModel 中的 属性。您不应该 获取代码隐藏中的DataContext
。您将需要使用 Command
,因为您需要将 View 与 ViewModel.
分开
有一个耻辱,如果你的观点有代码隐藏,那么你应该被带回去并在后脑勺上开枪,执行风格。这是不正确的。
综上所述,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}"
如果您在实施过程中需要任何进一步的帮助或者不清楚,请告诉我。
我有一个 WPF 项目,需要创建一个特定于域但将在多个视图中重复使用的控件。
控件必须分三部分显示小数值,整数部分和小数部分分成两部分,字体大小不同。我对金额有依赖性 属性,然后在后面的代码中将金额分成 3 部分,以便我可以在特定标签中显示它们。我还使用小数来决定金额是上升还是下降,然后更改控件的背景颜色。所有这些都是在后面的代码中完成的。我知道有人说代码隐藏是邪恶的,在大多数情况下我都同意。但是,否则您将如何实施?
不,不应该不惜一切代价。
记住,数据就是数据,UI就是UI。
例如,如果您的代码 仅 UI 东西,那么隐藏代码并没有错。
任何与实际数据一起工作的东西,包括与 ViewModel
一起工作的东西,通常都应该在代码隐藏中避免,因为你会创建依赖关系,中断 MVVM 设计模式。
所以更直接地回答你的问题,你所做的没有任何问题。
编辑
让我进一步解释。
想象一下场景,您有一个视图,其中一个按钮需要在单击后启动 Storyboard
。 (当然,你只能在XAML中这样做,但这只是一个例子)
在这种情况下,向按钮添加单击事件并从代码隐藏启动故事板没有任何问题。这只是 UI 代码,所以它是安全的。
但是,假设您的按钮在被单击时需要更改 ViewModel 中的 属性。您不应该 获取代码隐藏中的DataContext
。您将需要使用 Command
,因为您需要将 View 与 ViewModel.
有一个耻辱,如果你的观点有代码隐藏,那么你应该被带回去并在后脑勺上开枪,执行风格。这是不正确的。
综上所述,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}"
如果您在实施过程中需要任何进一步的帮助或者不清楚,请告诉我。