6

我正在开发一个 WPF/MVVM 应用程序,并且我有一个列表框绑定到 ViewModel 中的数据。在不同的点上,我需要视图模型使列表框滚动到给定的元素。

如何在不创建自定义控件的情况下做到这一点,同时仍然保持良好的关注点分离?

我目前通过在视图层中创建一个具有依赖属性的自定义行为类来使其工作,VisibleIndex然后 XAML 代码将其绑定到视图模型中的整数:

<ListBox x:Name="myListBox" 
        local:ListBoxVisibilityBehavior.VisibleIndex="{Binding VisibleIndex}">

当设置整数时,它会触发依赖属性更新处理程序,该处理程序告诉列表框滚动到关联的索引。

这似乎有点棘手,因为列表框永远不会更改依赖项属性值,并且仅在值更改时才调用更新处理程序,因此确保相关项可见的唯一方法是执行以下操作:

// view-model code
this.VisibleIndex = -1;
this.VisibleIndex = 10;

我目前使用行为类的唯一原因是绑定我的自定义依赖属性,有没有办法用事件来做这样的事情?

4

2 回答 2

0

在您的情况下,有些需要附加属性 - 因为在某些时候,您需要在“某处”调用以下方法......

ListBox.ScrollIntoView(item)  

或者

ListBoxItem.BringIntoView();

为此,您需要某种代码,附加的属性/行为是一种很好的打包方式,不会影响您的 MVVM。

话虽如此-如果您只需要始终将“选定项目”滚动到视图中(大多数情况下都是如此)。然后您可以使用不同的基于附加属性的解决方案(再次):

mvvm 如何使列表视图自动滚动到列表视图中的新项目

那么你所要做的就是设置或绑定到SelectedItem.

如果您愿意,那会“更好”一些-但机制是相同的。

于 2013-04-22T16:03:20.953 回答
0

对于任何对这个问题的答案感兴趣的人,WPF 论坛上的一位 MS 工程师为我澄清了这一点。不是直接绑定到事件,而是绑定到封装该事件的包装器对象。然后,该行为可以从其 DP 中获取对包装器的引用并对其执行任何操作,即订阅事件、触发它等。

于 2013-05-03T05:23:14.627 回答