我写这篇文章只是为了帮助那些可能面临同样问题的人。我有一个列表框,选择模式设置为扩展。在我的应用程序的某个用户故事中,我需要取消选择所有选定的项目,以编程方式选择一个项目并将其显示在视图中。好的,有很多样本,但由于某种原因,我的代码无法正常工作:如果所选项目被隐藏,则SelectionChanged事件将与空的已添加项目集合一起进行。我的案例和样本之间的区别在于选择模式...
答案 0 :(得分:2)
经过半天的挖掘,在一些看似无关的案例中,一些好人暗示了“非常直观”的解决方案:将列表框属性ScrollViewer.CanContentScroll设置为False - 为什么我没想到第一个......?现在选择你最喜欢的方法,它会做它应该做的。仅供参考我的解决方案:
<ListBox Name="listUsers"
SelectionMode="Extended"
ScrollViewer.CanContentScroll="False"> <!-- more properties, template, ItemContainerStyle, etc.... -->
<i:Interaction.Behaviors>
<b:ScrollSelectedListBoxItemIntoViewBehavior />
</i:Interaction.Behaviors>
<ListBox>
这是包含在行为中的事件处理程序:
public class ScrollSelectedListBoxItemIntoViewBehavior : Behavior<ListBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.SelectionChanged += AssociatedObject_SelectionChanged;
}
protected override void OnDetaching()
{
AssociatedObject.SelectionChanged -= AssociatedObject_SelectionChanged;
base.OnDetaching();
}
void AssociatedObject_SelectionChanged(
object sender,
SelectionChangedEventArgs e)
{
if (e.AddedItems == null || e.AddedItems.Count == 0)
return;
var listBoxItem = AssociatedObject.ItemContainerGenerator.ContainerFromItem(e.AddedItems[0]) as ListBoxItem;
if (listBoxItem != null)
listBoxItem.BringIntoView();
}
}
希望这会节省一些时间给另一个不快乐的灵魂,或者有更多经验的人会建议更好的解决方案。