Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ViewModel中实现ListBox滚动视图功能_C#_Wpf_Xaml_Mvvm_Viewmodel - Fatal编程技术网

C# 如何在ViewModel中实现ListBox滚动视图功能

C# 如何在ViewModel中实现ListBox滚动视图功能,c#,wpf,xaml,mvvm,viewmodel,C#,Wpf,Xaml,Mvvm,Viewmodel,我有一个带有文本框的屏幕,用户可以在其中键入两个字符的状态代码。文本框下方是一个包含所有50个州代码的列表框。TextBox绑定到VM中的属性,而SelectedItem绑定到VM中的属性。一切正常 我希望UI工作的方式是,当用户从列表框中选择一个状态时,文本框会自动填充,并且工作正常 当用户在文本框中输入状态时,它变得混乱。当我得到第一个字符时,我要做的是将列表框重新定位在该字母的第一个匹配状态代码处,例如,如果ListBox位于“AK”(阿拉斯加),并且用户要为爱达荷州键入“ID”,当我得到

我有一个带有
文本框的屏幕,用户可以在其中键入两个字符的状态代码。
文本框
下方是一个包含所有50个州代码的
列表框
TextBox
绑定到VM中的属性,而
SelectedItem
绑定到VM中的属性。一切正常

我希望UI工作的方式是,当用户从
列表框
中选择一个状态时,
文本框
会自动填充,并且工作正常

当用户在
文本框
中输入状态时,它变得混乱。当我得到第一个字符时,我要做的是将列表框重新定位在该字母的第一个匹配状态代码处,例如,如果
ListBox
位于“AK”(阿拉斯加),并且用户要为爱达荷州键入“ID”,当我得到“I”时,我要定位
ListBox
,以便您可以看到第一个“I”状态,也就是“IA”(爱荷华州)

如果我使用代码隐藏并指向
SelectionChanged=bringselectiontoview
,此方法编码如下,效果非常好:

private void BringSelectionIntoView(object sender, SelectionChangedEventArgs e)
{
    ListBox lb = (ListBox)sender;
    lb.ScrollIntoView(lb.SelectedItem);
}
我所要做的就是扫描状态代码列表,直到第一个字母匹配,然后更新
Index
属性,将
SelectedIndex
绑定到该属性,然后调用
bringselectiontoview()
方法,我就拥有了我想要的UI行为

然而,试图用最纯粹的MVVM方法来实现这一点却被证明是相当令人沮丧的。我没有使用MVVMLight或ExpressionBlend——我想要一种在MVVM中实现这一点的简单方法。我理解最纯粹的人不在视图中放置任何UI代码的想法,但是框架执行这种行为非常麻烦。当你必须创建这样一个迟钝的管道来强迫自己坚持一个模式时,回报会逐渐减少,而在这个方法中加入两行完美工作的代码则更为实际

所以我的问题是:我做错了什么吗?有没有一种简单的方法可以在不违反MVVM的情况下实现这一点?如果解决方案需要额外的SDK或其他人的框架,那就令人失望了。这就意味着MVVM在一般的OOP意义上并没有特别好的立足点


是否有人看到了我试图做的错误,或者你看到了一个简单化的解决方案?谢谢

MVVM并不是说没有任何代码隐藏

你在这里说的是视图行为。只要不弄乱事件处理程序中的数据,它就完全适合于代码隐藏

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

这并没有破坏MVVM

保持这样。保持简单


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

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

谢谢您的回复。我查看了一些关于行为的文章,并模拟了一些代码,结果发现我需要(在下面的示例中)安装Expression Blend。还有其他方法可以获得基于行为的功能吗?@John Behaviors是其中的一部分,可以单独安装,而无需安装Expression Blend。我将研究Expression SDK,因为我确信它将使许多MVVM任务变得更简单,但出于同样的原因,在我看来,一个基本的声音模式应该依赖于它的算法优雅,而不是供应商的SDK。也就是说,我并不反对使用更好的工具来完成工作+1为建议和链接@Michael-我正在安装Expression SDK,并将查看行为。谢谢你的建议@约翰:WPF中有两种行为。还有一些是表达式SDK附带的。还有一些只使用依赖属性的。我通常认为后者是“依附行为”。我不确定是否有一个更简洁的词来形容前者。请看“附加行为”的想法。啊哈,好吧,这是我喜欢的答案!谢谢我试着在视图中使用任何代码,感觉就像我在创建一个电池供电的烟灰缸,有17个活动部件和一本用户手册,而我真正想要的只是一个简单的烟灰缸。您的回答是有道理的,使用两行解决方案代替构建大型类来解决这一次要(但需要)功能,我认为这张牌在这里发挥的作用非常大。谢谢大家!@John,请记住,您不能将业务逻辑或数据相关代码放在代码后面。是的,这绝对有道理。谢谢