如何控制 MVVM WPF 应用程序中列表框的滚动位置
我有一个启用垂直滚动的大列表框,我的 MVVM 有新建和编辑 ICommand。 我正在将新项目添加到集合的末尾,但我希望当我调用 MVVM-AddCommand 时滚动条也自动定位到末尾。 我还从应用程序的其他部分使项目可编辑(通过使用特定行项目调用 EditCommand),以便我的 ListBoxItem 使用 DataTrigger 进入编辑模式,但是我将如何将该特定行(ListBoxItem)带到视图通过调整滚动位置。
如果我在视图端执行此操作,我可以调用 listBox.ScrollInToView(lstBoxItem)。 但从 MVVM 角度来看,解决这个常见滚动问题的最佳方法是什么?
I have got a big ListBox with vertical scrolling enabled, my MVVM has New and Edit ICommands.
I am adding new item to the end of the collection but I want the scrollbar also to auto position to the End when I call my MVVM-AddCommand.
I am also making an item editable(By calling EditCommand with a particular row item) from some other part of the application so that my ListBoxItem getting in to edit mode using DataTrigger, but how will I bring that particular row(ListBoxItem) to the view by adjusting the scroll position.
If I am doing it in the View side I can call listBox.ScrollInToView(lstBoxItem).
But what is the best way to solve this common Scroll issue from an MVVM perspective.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我通常在
ListBox
上设置IsSynchronizedWithCurrentItem="True"
。然后,我添加一个SelectionChanged
处理程序,并始终将所选项目带入视图,代码如下:从我的虚拟机中,我可以获得默认集合视图并使用
MoveCurrent*()< 之一/code> 方法来确保正在编辑的项目是当前项目。
注意:编辑为使用
ListBox.ScrollIntoView()
来适应虚拟化I typically set
IsSynchronizedWithCurrentItem="True"
on theListBox
. Then I add aSelectionChanged
handler and always bring the selected item into view, with code like this:From my VM I can get the default collection view and use one of the
MoveCurrent*()
methods to ensure that the item being edited is the current item.NOTE: Edited to use
ListBox.ScrollIntoView()
to accomodate virtualization在 MVVM 中使用此功能可以通过附加行为轻松完成,如下所示:
然后在视图广告中在顶部引用此引用:
并执行以下操作:
现在,当 SelectedItem 更改时,行为将为您执行 BringIntoView() 调用。
Using this in MVVM can be easily accomplished via an attached behavior like so:
Then in the View ad this reference at the top:
And do this:
Now when the SelectedItem changes the behavior will do the BringIntoView() call for you.
这是已接受答案的附加属性形式:
用法:
This is the attached property form of the accepted answer:
Usage:
如果上面的代码不适合您,请尝试一下
XAML 中的用法
If the above code doesn't work for you, give this a try
Usage in XAML
下面是我对 @VahidN 建议的解决方案的 ListView 改编。我希望这可以帮助正在寻找类似解决方案的人。
将命名空间添加到您的 Xaml 文件:
Xaml 标记中的用法:
请注意,以下属性和值是可选的:
Below is my ListView adaptation of the solution suggested by @VahidN. I hope this help somebody looking for a similar solution.
Add the namespace to your Xaml file:
Usage in Xaml Markup:
Please note that the following properties and values are optional: