【问题标题】:How to a implement ListBox ScrollIntoView functionality in a ViewModel如何在 ViewModel 中实现 ListBox ScrollIntoView 功能
【发布时间】: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);
}

我所要做的就是扫描状态代码列表直到第一个字母匹配,然后更新绑定到SelectedIndexIndex 属性,然后噗,BringSelectionIntoView() 方法被调用,我完全有我想要的 UI 行为。

然而,尝试以最纯粹的 MVVM 方法来执行此操作已被证明非常令人沮丧。我没有使用 MVVMLight 或 ExpressionBlend——我想要一种在 MVVM 中执行此操作的简单方法。我理解最纯粹的心态,即不将任何 UI 代码放在视图中,但框架执行这种行为非常麻烦。当您必须创建这种钝的管道来强迫自己遵守某种模式时,就会出现收益递减点,而使用两行代码完美运行的方法更为实际。

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

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

【问题讨论】:

    标签: c# wpf xaml mvvm viewmodel


    【解决方案1】:

    MVVM 并不是没有任何代码。

    您在这里谈论的是 VIEW 行为。只要您不弄乱事件处理程序中的数据,它就非常适合后面的代码。

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

    这不会破坏 MVVM。

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

    您仍然应该有一个 ViewModel 和一个 Model 来保存 UI 显示的 DATA。

    【讨论】:

    • 啊哈,好吧,这是我喜欢的答案!谢谢!我想尽一切办法在视图中添加任何代码,感觉就像我正在创建一个带有 17 个活动部件和用户手册的电池供电的烟灰缸,而我真正想要的只是一个简单的烟灰缸。您的回答是有道理的,并且使用 2 行解决方案代替构建一个大类来解决这个次要(但要求)的功能,好吧,我认为这些牌在这里几乎可以发挥自己的作用。谢谢!
    • @John Still,请记住,您不能将业务逻辑或数据相关代码放在后面的代码中。
    • 是的,这绝对有道理。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复。我查看了一些关于行为的文章,并模拟了一些代码,但发现我需要(在我下面的示例中)安装 Expression Blend。还有其他方法可以获得基于行为的功能吗?
    • @John Behaviors 是 Expression SDK 的一部分,可以单独安装,无需安装 Expression Blend。
    • 我会研究一下 Expression SDK,因为我确信它会使许多 MVVM 任务变得更容易,但出于同样的原因,一个基本合理的模式应该依赖于它的算法优雅而不是以我的拙见,供应商的 SDK。也就是说,我并不反对使用更好的工具来完成工作。 +1 的建议和链接!
    • @Michael - 我正在安装 Expression SDK 并将查看行为。感谢您的建议!
    • @John:WPF 中有两种类型的行为。 Expression SDK 附带了一些。还有一些只使用依赖属性的。我通常看到后者的术语“附加行为”。我不确定前者是否有更简洁的术语。有关“附加行为”的想法,请参阅 this article
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多