我有一个屏幕,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 意义上没有特别好的立足点。
有人看到我正在尝试做的事情有错误,还是您在这里看到了一个简单的解决方案?谢谢!