具有扩展选择模式的ListBox,在视图中选择

时间:2013-06-15 00:27:01

标签: .net wpf listview listbox

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

1 个答案:

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

希望这会节省一些时间给另一个不快乐的灵魂,或者有更多经验的人会建议更好的解决方案。