ListBox ItemsSource и Items пусто, когда вызывается либо свойствоchanagedtrigger, либо datastorechangedtrigger - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть список, для которого я пытаюсь построить триггерацию.По сути, я хотел бы, чтобы мое срабатывание запускалось при обновлении ItemsSource или Items.Я попытался использовать PropertyChangedTrigger и DataStoreChangedTrigger.Проблема в том, что при выполнении любого из этих триггеров мой ItemsSource в это время пуст.Итак, вопрос в том, к какому событию я могу подключиться, чтобы узнать, когда изменился мой ItemsSource?Я использую шаблон mvvm и поэтому не могу иметь никакого кода позади.Вот код

<ListBox x:Name="commentaryViewItems" 
        VirtualizingStackPanel.IsVirtualizing="False" 
        Background="White" 
        ItemsSource="{Binding CommentaryItemViewsModels}">
<iy:Interaction.Triggers>
    <is:DataStoreChangedTrigger Binding="{Binding Path=ItemsSource, ElementName=commentaryViewItems}">
        <localBehaviors:AutoScrollingTargetedTriggerAction></localBehaviors:AutoScrollingTargetedTriggerAction>
    </is:DataStoreChangedTrigger>                                        
</iy:Interaction.Triggers>
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <local:CommentaryItemView DataContext="{Binding}"></local:CommentaryItemView>
    </DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>



public class AutoScrollingTargetedTriggerAction : TriggerAction<ListBox>
{
protected override void Invoke(object parameter)
{
    ListBox items = AssociatedObject as ListBox;

    if (items != null)
    {
        ItemCollection commentaryItemViewModels = items.Items;

        if (commentaryItemViewModels != null)
        {
            IList<ICommentaryItemViewModel> viewModels = new List<ICommentaryItemViewModel>();
            foreach (var viewModel in commentaryItemViewModels)
            {
                ICommentaryItemViewModel currentViewModel = viewModel as ICommentaryItemViewModel;
                if (currentViewModel != null)
                    viewModels.Add(currentViewModel);
            }

            if (viewModels.Count > 0)
            {
                // if there is more than one date header go to first one and move scroll to there
                if (viewModels.Count(c => c.IsTitleBarVisible == true) > 1)
                {
                    // get first viewmodel with header
                    ICommentaryItemViewModel viewModel =
                        viewModels.FirstOrDefault(f => f.IsTitleBarVisible == true);
                    if (viewModel != null)
                        items.ScrollIntoView(viewModel.View);
                }

                // if there is only one header move scroller to last item
                if (viewModels.Count(c => c.IsTitleBarVisible == true) == 1)
                {
                    ICommentaryItemViewModel viewModel =
                        viewModels.FirstOrDefault(f => f.IsTitleBarVisible == true);
                    if (viewModel != null)
                        items.ScrollIntoView(viewModel.View);
                }
            }
        }
    }
}
}

Ответы [ 2 ]

0 голосов
/ 21 ноября 2011

Я использовал наблюдаемую коллекцию. Проблема в том, что я пытаюсь прокрутить свой список на основе элементов, содержащихся в нем. Таким образом, во время изменения наблюдаемой коллекции это не обязательно время обновления списка. В итоге я подключился к кнопке, которая была у меня ниже, и, кажется, это происходит в подходящее время.

0 голосов
/ 17 ноября 2011

Если вы используете ObservableCollection<T> в качестве вашего ItemsSource, он будет обрабатывать события, измененные коллекцией.

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