0

我有一个屏幕,TextBox用户可以在其中键入 2 个字符的状态代码。下面TextBox是一个ListBox包含所有 50 个州代码的。TextBox绑定到 VM 中的属性,并且绑定SelectedItem到 VM 中的属性。这一切都很好。

我希望 UI 工作的方式是当用户从 中选择一个状态时ListBox,它TextBox会自动填充,这很好。

当用户在TextBox. 当我得到第一个字符时,我想做的是将列表框重新定位在该字母的第一个匹配状态代码处,例如,如果ListBox它位于“AK”(阿拉斯加)并且用户要键入“爱达荷州的 ID”,当我得到“I”时,我想定位它,ListBox这样您就可以看到第一个“I”状态,即“IA”(爱荷华州)。

如果我使用后面的代码SelectionChanged=BringSelectionIntoView并使用如下编码的方法指向,它会很好用:

private void BringSelectionIntoView(object sender, SelectionChangedEventArgs e)
{
    ListBox lb = (ListBox)sender;
    lb.ScrollIntoView(lb.SelectedItem);
}

我所要做的就是扫描状态代码列表直到第一个字母匹配,然后更新绑定的Index属性SelectedIndex,然后噗,BringSelectionIntoView()方法被调用,我得到了我想要的 UI 行为。

然而,试图以最纯粹的 MVVM 方法来做到这一点已被证明是非常令人沮丧的。我没有使用 MVVMLight 或 ExpressionBlend——我想要一种在 MVVM 中执行此操作的简单方法。我理解不将任何 UI 代码放在视图中的最纯粹的心态,但是该框架执行这种行为非常麻烦。当您必须创建如此迟钝的管道以强迫自己遵守某种模式时,收益递减点就会出现,而将具有 2 行完美运行的代码的方法放入该方法更为实际。

所以我的问题是:我做错了什么吗?有没有一种简单的方法可以在不违反 MVVM 的情况下完成这项工作?如果解决方案需要额外的 SDK 或某人的框架,那将是令人失望的。这表明 MVVM 在一般的 OOP 意义上没有特别好的立足点。

有人看到我正在尝试做的事情有错误,还是您在这里看到了一个简单的解决方案?谢谢!

4

2 回答 2

1

MVVM 并不是没有任何代码。

您在这里谈论的是 VIEW 行为。只要您不弄乱事件处理程序中的数据,它就非常适合后面的代码。

您正在使用 VIEW 事件处理程序来操作 VIEW 方面。

这不会破坏 MVVM。

保持这种方式。把事情简单化。

您仍然应该有一个 ViewModel 和一个 Model 来保存 UI 显示的 DATA。

于 2013-05-16T19:55:41.317 回答
0

这是附加行为的完美用例。您可以编写一次此行为并将其用于所有列表框,而无需编写任何其他代码。如果您希望我详细说明,请询问,我会发布更多信息。

于 2013-05-16T19:59:44.873 回答