在ItemSource的重新加载时刷新WPF ComboxBox的滚动位置

时间:2016-05-24 11:37:54

标签: wpf xaml

我有ComboBox使用ListBox来显示项目。 ListBox的{​​{1}}与ItemSource绑定。

问题:一旦我打开CollectionViewSource并滚动项目并将其保留在中间或底部。一旦我重新打开ComboBox,即使我刷新或重新加载ComboBoxItemSource),滚动条也会保留在我上次离开的位置。我希望每次重新加载CollectionViewSource时都将其作为默认值(顶部)。

在XAML中有没有办法做到这一点?另外,我不能使用Behavior或Attach属性。我想要任何模板或风格。

1 个答案:

答案 0 :(得分:0)

为了使ListBox上的Style体现<ScrollViewer>的某些行为,您需要使用附加属性/附加行为来控制ScrollViewer的“抓取器”位置。这是因为您的集合绑定到ListBox并通知何时更新需要驱动ListBox上本身不存在的行为。可以使用<ControlTemplate>本身重置滚动位置<ScrollViewer>,但我想这很难,因为它可能涉及使用您的ItemsSource基于DataTriggering操纵Transforms / StoryBoards,但是这可能导致需要使用Attached属性的依赖,由于某种原因你不能使用...

如果您只是想立即获得结果,并且您不关心可测试性或可重用性,我会在代码隐藏中处理TargetUpdated事件。这最终是附加行为最终会做的事情。另一方面,如果您确实关心可重用性,那么您需要评估并质疑为什么不能使用附加行为(它们也是可测试的);附加行为也比尝试编辑ControlTemplate更容易。

以下是代码隐藏方法:

<强>的.xaml

<ListBox x:Name="myListBox" 
        ItemsSource="{Binding MyItemsSource, NotifyOnTargetUpdated=True}"
        TargetUpdated="ListBox_TargetUpdated"/>

<强> .xaml.cs

private void ListBox_TargetUpdated(object sender, DataTransferEventArgs e)
{
    if (myListBox.Items.Count > 0)
        myListBox.ScrollIntoView(myListBox.Items[0]);
}

编辑:另一方面,如果您使用的是MVVM,则可以执行以下操作:SO post建议并设置IsSynchronizationWithCurrentItem="True"并刷新ItemsSource 1}},只需将SelectedItem设置为列表中的第一个,然后处理vm中的SelectionChanged事件。