我有一个带有TextBox
的屏幕,用户可以在其中键入2个字符的状态代码。TextBox
下面是包含所有50个州代码的ListBox
。TextBox
绑定虚拟机属性,SelectedItem
绑定虚拟机属性。
我想让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);
}
我所要做的就是扫描状态代码列表,直到第一个字母匹配,然后更新SelectedIndex
绑定到的Index
属性,然后,调用BringSelectionIntoView()
方法,我就有了我想要的UI行为。
试图在一个纯粹的MVVM方法中做到这一点,然而,被证明是相当令人沮丧的。我不使用MVVMLight或ExpressionBlend——我想要一个简单的方法在MVVM中做到这一点。我理解最纯粹的人不把任何UI代码放在视图中的心态,但是框架要实现这种行为是非常麻烦的。当你不得不创建这种笨拙的管道来强迫自己坚持一种模式时,当用两行代码完美地放入方法要实际得多时,就会出现收益递减的情况。
所以我的问题是:我做错了什么,有没有一个简单的方法来使这个工作不违反MVVM?如果解决方案需要额外的sdk或某人的框架,那将是令人失望的。这表明MVVM在一般的OOP意义上并没有特别好的立足点。
有人看到了我试图做的错误,还是你看到了一个简单的解决方案?谢谢!
MVVM不是关于没有任何代码。
你在这里谈论的是VIEW行为。只要您不弄乱事件处理程序中的DATA,它就完全适合后面的代码。
您正在使用VIEW事件处理程序来操作VIEW方面。
这不会破坏MVVM。
保持这种状态。保持简单。
你仍然应该有一个ViewModel和一个Model来保存UI显示的DATA
这是附加行为的完美用例。您可以编写一次此行为并将其用于所有列表框,而无需编写任何额外的代码。如果你想让我详细说明,请问,我会发布更多的信息。