【问题标题】:How could I reuse my code behind?我怎样才能重用我的代码?
【发布时间】:2015-10-02 21:34:25
【问题描述】:

我有两个布局完全不同的控件,但它们的 XAML 结构非常相似(相同种类的容器甚至相同的元素名称),因此它们背后的代码是相同的。不幸的是,到目前为止,我不得不为这两个类中的每一个上的所有事件处理程序重复代码。

我现在正在使用组合提取卫星类的通用功能,但构造函数、字段声明和初始化的冗余仍然困扰着我很多。

所以问题归结为:

当两个用户控件只有布局差异但代码隐藏相同时,有没有办法避免代码后面出现冗余代码?

【问题讨论】:

  • 如果它们共享相同的事件和逻辑,为什么不创建一个实现命令的视图模型呢?在这种情况下,两个控件都将使用相同的视图模型,您无需再次重写事件。实际上最好将代码保留为空以获得更好的结果。看看这个怎么做,wpf-tutorial.com/commands/using-commands
  • 取决于你在做什么附加属性可能是正确的。他们作曲很好。

标签: wpf xaml code-behind


【解决方案1】:

WPF 使用可以更改的控件模板来区分这些问题。 “代码隐藏”是行为。您不需要 ViewModel。

【讨论】:

  • 我认为你成功了。事实上,正如我已经明确指出的那样,只有布局/着色/呈现方式从一个变为另一个。这就是控制模板的确切用例:同一个类具有不同的 XAML。谢谢!
【解决方案2】:

解决办法很少:

  1. 创建继承自 UserControl 的抽象类。将通用逻辑放在 BaseClass 中。

    而不是将您的“UserControl”更改为从您的 BaseClass 而不是 UserControl 继承。所以最后你会从你的基类继承两个 UserControls。

  2. 考虑创建 Control,而不是 UserControl。您可以为控件创建两个 ControlTemplates。

    <local:YourControl Template="{StaticResource Template1}" />
    <local:YourControl Template="{StaticResource Template2}" />
    
  3. 在 MVVM 中,您可以轻松地为单个视图模型创建多个视图。虽然有些人更喜欢每个视图模型单个视图,反之亦然,但您可以创建两个从一个公共基础继承的视图模型,或者从 FirstViewModel 继承的 SecondViewModel。

【讨论】:

  • 感谢您的回答!我最终选择了模板方法(这实际上是显而易见的方法,现在已经弄清楚了)。
【解决方案3】:

您的实际要求只有您自己知道。我正在回答您强调的问题:

Is there a way to avoid redundant code behind code when two UserControls 
have only layout differences, but identical code-behind?

如果您希望灵活地为不同布局分离视图,那么最好选择松散的 XAML 文件。并在运行时加载这些文件。您可以在运行时更改这些文件,而无需更改您的应用程序代码。就像我们可以即时更改 CSS/JS 文件一样。

我开发了一个满足您需求的应用程序。我开发了 3 个用户控件:

  1. UserControl1:使用松散的文本文件进行布局
  2. UserControl2:使用通用视图模型,您可以在其中集中连接事件处理程序。但这可能不适合这里。
  3. UserControl3:使用松散的 xaml 文件进行布局

你可以检查,如果需要改进,我会做。

Dropbox link

【讨论】:

  • 这是最简单的方法,而且工作量最小/完全不费力。
  • 仅供参考,我没有投反对票,感谢您的回答。您所说的“松散 XAML”是指 ControlTemplates 吗?查看接受的答案。
【解决方案4】:

基于有限范围的最佳实践是使用 MVVM 模式并将代码移动到适当的位置。

但要回答您的问题,具体来说,我会将代码分解为一个或多个可移植类库。根据应用程序的复杂性,您可以将代码分解到项目中的类中。

【讨论】:

  • 感谢您的反对。我仍然会回答您如何在后面使用代码的明显问题,您将在 ViewModel 和可能的 View 中的第一个示例中重用它。在第二个示例中, in 将在可移植类库中重用。工具。
  • 仅供参考,投反对票的不是我,感谢您的回答!
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多