如何在ViewModel中实现ListBox ScrollIntoView功能

时间:2013-05-16 19:42:14

标签: c# wpf xaml mvvm viewmodel

我有一个TextBox的屏幕,用户可以在其中键入2个字符的州代码。 TextBox下面是包含所有50个州代码的ListBoxTextBox绑定到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方法做到这一点已经证明非常令人沮丧。我没有使用MVVMLight或ExpressionBlend - 我想在MVVM中使用一种简单的方法。我理解最纯粹的思维方式,即不在视图中放置任何UI代码,但是这个框架实现这种行为是非常麻烦的。当你必须创建这样的钝性管道以迫使自己坚持一个模式时,有一个收益递减点,因为使用2行代码完美地处理方法更加实用。

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

有人看到我正在尝试做的错误,或者你在这里看到一个简单的解决方案?谢谢!

2 个答案:

答案 0 :(得分:1)

MVVM并不是没有任何代码。

你在这里谈论的是VIEW行为。只要你没有弄乱事件处理程序中的DATA,这完全适合后面的代码。

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

这不会打破MVVM。

保持这种状态。保持简单。

你仍然应该有一个ViewModel和一个模型来保存UI显示的数据。

答案 1 :(得分:0)

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