0

我写这篇文章只是为了帮助可能面临同样问题的其他人。我有一个选择模式设置为扩展的列表框。在我的应用程序的某个用户故事中,我需要取消选择所有选定的项目,以编程方式仅选择一个项目并将其显示出来。好的,那里有很多示例,但由于某种原因,我的代码无法正常工作:如果所选项目被隐藏,则 SelectionChanged 事件与空的已添加项目集合一起出现。我的案例和那里的样本之间的区别在于选择模式......

4

1 回答 1

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();
    }
}

希望这将为那里的另一个不快乐的灵魂节省一些时间,或者有更多经验的人会提出更好的解决方案。

于 2013-06-15T00:27:00.643 回答