坏主意还是好主意? WPF:以编程方式在代码隐藏中应用样式
Bad or good idea? WPF: Apply styles in code-behind programmatically
情况
我正在开发一个(MVVM,复合)WPF 应用程序,其中所有事情都应该以非常松散耦合的方式完成。
关于应用样式,我已经有了一个不错的小解决方案:
使用的每个控件都存在于单独的 DLL 中,无论是否需要特殊样式。
在构造函数中,每个控件都调用一个静态方法,该方法为该控件提供 正确的 样式。
TextBlock
的示例:
public partial class TextBlock : System.Windows.Controls.TextBlock
{
public TextBlock()
{
InitializeComponent();
//The class ResourceCreator knows, which style to deliver
this.Style = (System.Windows.Style)ResourceCreator.FindResourceByName(
Styles.StyleNames.TextBlock);
}
}
到目前为止,该程序设计还不错,因为您无需在任何地方应用样式。 class ResourceCreator
知道该控件应用哪种样式,当然它可以在不同样式之间切换。控件本身并不知道,将应用哪种样式。
我想要什么
在 MVVM 应用程序中,根据经验,View 的代码隐藏中根本不应该有任何逻辑。一切都发生在视图模型中。
我想打破这个规则只是为了应用样式。任何 window 或视图都应该在代码隐藏中有一个方法,该方法遍历可视化树。应识别每个检测到的控件类型,然后应用适当的样式。
问题
这是个好主意还是坏主意?是否有任何我没有看到的事实反对这个想法?
In an MVVM application, a rule of thumb is, that there should be no logic at all in the code-behind of the View. Everything happens in the view model.
你错了。 MVVM 并不是要从视图中删除代码。这是关于关注点的分离。在视图的代码隐藏中编写任何 与视图相关的 代码是完全没问题的。
并且样式完全与视图相关。任何控制视图层或与视图层交互的代码也是如此,这些代码难以或低效地在 XAML 中表达,例如复杂的动画。这些东西应该不在视图模型中实现。
所以你在这里没有违反任何 MVVM 规则:)
您的应用程序逻辑应该在视图模型中实现,您的业务逻辑应该在模型中实现。但是任何纯基于视图的功能都应该在视图中实现。
情况
我正在开发一个(MVVM,复合)WPF 应用程序,其中所有事情都应该以非常松散耦合的方式完成。
关于应用样式,我已经有了一个不错的小解决方案:
使用的每个控件都存在于单独的 DLL 中,无论是否需要特殊样式。
在构造函数中,每个控件都调用一个静态方法,该方法为该控件提供 正确的 样式。
TextBlock
的示例:
public partial class TextBlock : System.Windows.Controls.TextBlock
{
public TextBlock()
{
InitializeComponent();
//The class ResourceCreator knows, which style to deliver
this.Style = (System.Windows.Style)ResourceCreator.FindResourceByName(
Styles.StyleNames.TextBlock);
}
}
到目前为止,该程序设计还不错,因为您无需在任何地方应用样式。 class ResourceCreator
知道该控件应用哪种样式,当然它可以在不同样式之间切换。控件本身并不知道,将应用哪种样式。
我想要什么
在 MVVM 应用程序中,根据经验,View 的代码隐藏中根本不应该有任何逻辑。一切都发生在视图模型中。
我想打破这个规则只是为了应用样式。任何 window 或视图都应该在代码隐藏中有一个方法,该方法遍历可视化树。应识别每个检测到的控件类型,然后应用适当的样式。
问题
这是个好主意还是坏主意?是否有任何我没有看到的事实反对这个想法?
In an MVVM application, a rule of thumb is, that there should be no logic at all in the code-behind of the View. Everything happens in the view model.
你错了。 MVVM 并不是要从视图中删除代码。这是关于关注点的分离。在视图的代码隐藏中编写任何 与视图相关的 代码是完全没问题的。
并且样式完全与视图相关。任何控制视图层或与视图层交互的代码也是如此,这些代码难以或低效地在 XAML 中表达,例如复杂的动画。这些东西应该不在视图模型中实现。
所以你在这里没有违反任何 MVVM 规则:)
您的应用程序逻辑应该在视图模型中实现,您的业务逻辑应该在模型中实现。但是任何纯基于视图的功能都应该在视图中实现。