【问题标题】:How to generate rows and columns of a grid in WPF MVVM without editing the view?如何在不编辑视图的情况下在 WPF MVVM 中生成网格的行和列?
【发布时间】:2021-01-09 17:44:01
【问题描述】:

我知道 MVVM 背后的想法是将 ViewViewmodel 分开,而 View 中的代码隐藏是不好的东西。

这就是我在不遵循 MVVM (xaml.cs) 时生成特定列数的方式。

for (int i = 0; i < Constants.GRID_COLUMN_NUMBER; i++)
{
    ColumnDefinition tempColumn = new ColumnDefinition();
    gridName.ColumnDefinitions.Add(tempColumn);
}

既然从 ViewModel 访问网格以生成行/列是一件坏事,那么实现此目的最有效的方法是什么?

使用带有代码隐藏的用户控件是一种可接受的解决方案吗?

【问题讨论】:

  • “视图中的代码隐藏是一件坏事” - ???。如果您说您理解这一点,请解释一下为什么会这样?
  • 将视图与视图模型分开”可以,但是“视图中的代码隐藏是一件坏事”是一个很大的误解。 MVVM 对后者只字未提。
  • MVVM 上下文中的代码绝对没有问题,只要它用于使视图工作。与 MVVM 背道而驰的是与业务逻辑或其他数据相关功能相关的代码。
  • 我在 uni 被教导,如果我要遵循 MVVM,我应该在 View code-behind 中没有代码。从你的语气来看,我只能假设允许存在 View 中的代码。我确实知道并非所有代码都可以从 View 中豁免,但我不确定我需要的是什么。
  • 为研磨生成列应该在视图中,因为它显然与用户的外观有关。所以你在这里很好。请记住,视图、视图模型和模型都是用户界面层的一部分。核心逻辑甚至在这背后。在模型部分中,您基本上构建了数据,视图模型包含用户与数据交互的逻辑。视图就是它的样子,因此它与 xaml 相关(如果您使用 WPF)。

标签: c# wpf mvvm


【解决方案1】:

您可以为此目的使用行为。您不必在 View 后面添加代码,只需创建一个专用类,负责将网格生成为 Behavior&lt;Grid&gt;,然后将其添加到您的 xaml。

Behavior&lt;Grid&gt; 也可以单独进行单元测试。

Microsoft Blend 使用这种方法。

例如

public class DynamicColumn : Behavior&lt;Grid&gt; {}

然后你就这样使用它

<Grid>
   <Interaction.Behaviors>
      <DynamicColumn />
   </Interaction.Behaviors>
<Grid>

您可以在这里找到更多信息:https://www.wpftutorial.net/Behaviors.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2011-10-12
    相关资源
    最近更新 更多