短版當列表框ScrollIntoView使用具有GroupDescriptions CollectionViewSource(即IsGrouping == TRUE)
我想當選擇被改變爲ListBox
項滾動到視圖。
龍版
我有綁定到CollectionViewSource
與GroupDescription
的ItemsSource
一個ListBox
,如下面的例子。
<Window.Resources>
<CollectionViewSource x:Key="AnimalsView" Source="{Binding Source={StaticResource Animals}, Path=AnimalList}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Category"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Window.Resources>
<ListBox x:Name="AnimalsListBox"ItemsSource="{Binding Source={StaticResource AnimalsView}}" ItemTemplate="{StaticResource AnimalTemplate}" SelectionChanged="ListBox_SelectionChanged">
<ListBox.GroupStyle>
<GroupStyle HeaderTemplate="{StaticResource CategoryTemplate}" />
</ListBox.GroupStyle>
</ListBox>
代碼隱藏文件中有SelectionChanged
事件。
public List<Animal> Animals { get; set; }
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBox control = (ListBox)sender;
control.ScrollIntoView(control.SelectedItem);
}
現在。如果我將AnimalsListBox.SelectedItem
設置爲當前不可見的項目,我想讓它在視圖中滾動。這是它變得棘手的地方,因爲ListBox
是羣組(IsGrouped
屬性是true
),調用ScrollIntoView
失敗。
System.Windows.Controls.ListBox
via Reflector。請注意0中的base.IsGrouping
。
public void ScrollIntoView(object item)
{
if (base.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
{
this.OnBringItemIntoView(item);
}
else
{
base.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new DispatcherOperationCallback(this.OnBringItemIntoView), item);
}
}
private object OnBringItemIntoView(object arg)
{
FrameworkElement element = base.ItemContainerGenerator.ContainerFromItem(arg) as FrameworkElement;
if (element != null)
{
element.BringIntoView();
}
else if (!base.IsGrouping && base.Items.Contains(arg))
{
VirtualizingPanel itemsHost = base.ItemsHost as VirtualizingPanel;
if (itemsHost != null)
{
itemsHost.BringIndexIntoView(base.Items.IndexOf(arg));
}
}
return null;
}
問題
- 任何人能解釋爲什麼它在使用分組不不工作?
ItemContainerGenerator.ContainerFromItem
總是返回null
,即使它的狀態狀態表明所有容器都已生成。
- 我怎樣才能實現滾動查看當使用分組?
您應該將答案更改爲正確的答案,而不是上面的答案。 – Valentein
@Valentein:我已經改變了標記的答案。但作爲[crazyarabian](http://stackoverflow.com/a/7375646/73025)建議確實幫助我診斷問題,如果您使用我最終的解決方案,那麼最好**這兩個答案**。 – Dennis
使用.NET 4.5.1和MVVM,您可以使用一種行爲來執行此操作。這種行爲在兩種情況下均有效,因爲它已經很晚了。 – Kelly