如何在ViewModel中实现ListBox ScrollIntoView功能



我有一个带有TextBox的屏幕,用户可以在其中键入2个字符的状态代码。TextBox下面是包含所有50个州代码的ListBoxTextBox绑定虚拟机属性,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

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

相关内容

  • 没有找到相关文章

最新更新