我有ComboBox
使用ListBox
来显示项目。 ListBox
的{{1}}与ItemSource
绑定。
问题:一旦我打开CollectionViewSource
并滚动项目并将其保留在中间或底部。一旦我重新打开ComboBox
,即使我刷新或重新加载ComboBox
(ItemSource
),滚动条也会保留在我上次离开的位置。我希望每次重新加载CollectionViewSource
时都将其作为默认值(顶部)。
在XAML中有没有办法做到这一点?另外,我不能使用Behavior或Attach属性。我想要任何模板或风格。
答案 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事件。