У меня есть список, для которого я пытаюсь построить триггерацию.По сути, я хотел бы, чтобы мое срабатывание запускалось при обновлении 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);
}
}
}
}
}
}