我有一个TextBox
的屏幕,用户可以在其中键入2个字符的州代码。 TextBox
下面是包含所有50个州代码的ListBox
。 TextBox
绑定到VM中的属性,SelectedItem
绑定到VM中的属性。一切正常。
我希望用户界面工作的方式是当用户从ListBox
中选择状态时,TextBox
会自动填写,这样就可以了。
当用户输入TextBox
中的状态时,它变得混乱。当我得到第一个字符时,我想要做的是在该字母的第一个匹配状态代码处重新定位列表框,例如,如果ListBox
位于“AK”(阿拉斯加州)和用户将为爱达荷键入“ID”,当我得到“我”时,我想定位ListBox
,这样你就可以看到第一个“I”状态,即“IA”(爱荷华州)。
如果我在后面使用代码并使用以下编码方法指向SelectionChanged=BringSelectionIntoView
,则效果很好:
private void BringSelectionIntoView(object sender, SelectionChangedEventArgs e)
{
ListBox lb = (ListBox)sender;
lb.ScrollIntoView(lb.SelectedItem);
}
我所要做的就是扫描状态代码列表,直到第一个字母匹配,然后更新Index
绑定到的SelectedIndex
属性,以及poof,BringSelectionIntoView()
方法被调用,我有我想要的UI行为。
所以我的问题是:我做错了什么,是否有一种简单的方法可以在不违反MVVM的情况下完成这项工作?如果解决方案需要额外的SDK或某人的框架,那将是令人失望的。这表明MVVM在通用OOP意义上没有特别好的立足点。
有人看到我正在尝试做的错误,或者你在这里看到一个简单的解决方案?谢谢!
答案 0 :(得分:1)
MVVM并不是没有任何代码。
你在这里谈论的是VIEW行为。只要你没有弄乱事件处理程序中的DATA,这完全适合后面的代码。
您正在使用VIEW事件处理程序来操作VIEW方面。
这不会打破MVVM。
保持这种状态。保持简单。
你仍然应该有一个ViewModel和一个模型来保存UI显示的数据。
答案 1 :(得分:0)
这是附加行为的完美用例。您可以编写此行为一次,并将其用于所有列表框,而无需编写任何其他代码。如果您希望我详细说明,请询问,我会发布更多信息。