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