Я хочу добавить элемент в список, затем выбрать и перейти к нему.но свиток не перемещается к элементу.когда я пытаюсь добавить много элементов, прокрутка перемещается к элементу, но это не последний добавленный элемент.Кажется, listviewItem не генерируется сразу после добавления элемента с помощью привязки.
Я попытался добавить элемент, затем выбрать его (с помощью привязки) и прокрутить до последнего выбранного элемента.Но это не работает, потому что количество выбранных элементов будет равно нулю.
if (lV.SelectedItems.Count > 0)
{
// do it here (but it will not run because lV.SelectedItems.Count is zero)
}
Я также пытался получить элемент из привязки, но возвращаемое значение будет нулевым.
ListViewItem item = (ListViewItem)lV.ItemContainerGenerator.ContainerFromItem(lastItem);
//but item will be null
Обратите внимание, что ятакже используется VirtualizingPanel.IsVirtualizing="False"
как рекомендовано здесь .
Поскольку выбор по привязке работает хорошо, я рассмотрел привязку фокуса, но свойство IsFocused
только позволяет получить не установленный.Так как я могу это сделать?
==============================================================
Редактировать: у меня есть следующие коды в xaml:
<local:PrefectListView x:Name="lV"
AllowDrop="true"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
VirtualizingPanel.IsVirtualizing="False"
SelectionChanged="lVImage_SelectionChanged"
PreviewKeyDown="lV_PreviewKeyDown"
Drop="lV_Drop"
DragEnter="lV_DragEnter"
ItemDragsAndDropedToPC="lV_ItemDragsAndDropedToPC" >
<ListView.ItemTemplate>
<DataTemplate>
<Grid Width="80" Height="120" >
<Grid.RowDefinitions>
<RowDefinition Height="80"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Image Grid.Row="0" Source="{Binding Thumbnail}" Margin="5"/>
<TextBlock Grid.Row="1" Text="{Binding Name}" Margin="5,0,5,5" HorizontalAlignment="Center" VerticalAlignment="Top"
TextWrapping="Wrap" TextTrimming="CharacterEllipsis"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<EventSetter Event="MouseDoubleClick" Handler="lVItem_MouseDoubleClick"/>
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>
<Setter Property="Margin" Value="5,5,2,2"/>
</Style>
</ListView.ItemContainerStyle>
</local:PrefectListView>
В cs, после создания элементаЯ добавляю его к _navigationSources
, а затем использую следующий код для выбора и прокручиваю к нему:
private void SelectItems(bool clearPreviousSelecteds, bool focus, NavigationPanItemRow[] rows)
{
//force to run it on UI thread
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
//check arguments
if (rows == null) { throw new ArgumentNullException("rows"); }
//
for (int i = 0; i < rows.Length; i++)
{
if (rows[i] == null)
{ throw new ArgumentException("Atleast one of members is null", "rows"); }
}
//variables
NavigationPanItemRow lastItem = null;
//clear all selected
if (clearPreviousSelecteds)
{
_navigationSources.UnSelectAll();
}
//select
for (int i = 0; i < rows.Length; i++)
{
rows[i].IsSelected = true;
lastItem = rows[i];
}
//focus (I use it )
if (focus && lastItem != null)
{
lV.Focus();
ListViewItem it = (ListViewItem)lV.ItemContainerGenerator.ContainerFromItem(lastItem);
lV.ScrollIntoView(it);
}
//focus (also it)
if (focus && lV.SelectedItems.Count > 0)
{
lV.Focus();
((ListViewItem)lV.ItemContainerGenerator.ContainerFromItem(lV.SelectedItems[lV.SelectedItems.Count - 1])).Focus();
}
}));
}
Примечание: если я добавлю окно сообщения перед частью фокуса, поскольку это обеспечит некоторое время, код работает хорошо.