【发布时间】:2013-05-16 19:42:14
【问题描述】:
我有一个带有 TextBox 的屏幕,用户可以在其中键入 2 个字符的状态代码。在TextBox 下方是一个ListBox,包含所有50 个状态代码。 TextBox 绑定到 VM 中的属性,SelectedItem 绑定到 VM 中的属性。一切正常。
我希望 UI 工作的方式是当用户从ListBox 中选择一个状态时,TextBox 会自动填充,这工作正常。
当用户在TextBox 中输入状态时,它变得混乱。当我得到第一个字符时,我想要做的是将列表框重新定位在该字母的第一个匹配状态代码处,例如,如果ListBox 位于“AK”(阿拉斯加)并且用户要去为 Idaho 键入“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 意义上没有特别好的立足点。
是否有人看到我正在尝试做的事情有错误,或者您在这里看到了一个简单的解决方案?谢谢!
【问题讨论】:
标签: c# wpf xaml mvvm viewmodel