Прокрутите до последнего добавленного элемента в списке при использовании привязки - PullRequest
0 голосов
/ 10 марта 2019

Я хочу добавить элемент в список, затем выбрать и перейти к нему.но свиток не перемещается к элементу.когда я пытаюсь добавить много элементов, прокрутка перемещается к элементу, но это не последний добавленный элемент.Кажется, 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();
                }
            }));
        }

Примечание: если я добавлю окно сообщения перед частью фокуса, поскольку это обеспечит некоторое время, код работает хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...