Изменение ItemSource внутри SelectionChanged Событие вступает в силу после обработчика события - PullRequest
0 голосов
/ 07 сентября 2018

После изменения выбора поля со списком у меня есть коллекция, которую я хочу привязать к ItemsControl. Я хотел бы получить доступ к VisualTree элемента ItemsControl в обработчике SelectionChanged. Но изменение ItemsSource влияет на ItemsControl только после EventHandler. Возможно ли получить доступ к элементам в это время?

private void cbShows_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox cb = sender as ComboBox;
    if (cb.SelectedItem != null)
    {
        Show selectedShow = (Show)cb.SelectedItem;
        txtShowname.Text = selectedShow.ShowName;

        icHalfHourBlocks.DataContext = selectedShow.HalfHourItems;
        icHalfHourBlocks.ItemsSource = selectedShow.HalfHourItems;

        gridShowGrid.Visibility = Visibility.Visible;

        ////////////////////////////////////////////////
        // At this Time need the rendered visual tree //
        ////////////////////////////////////////////////
    }
}

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Вам просто нужно выполнить действие с диспетчером с помощью BeginInvoke. Теперь у меня есть доступ к визуализированному визуальному дереву, и я смог получить искомые элементы управления. Это мой код сейчас:

private void cbShows_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox cb = sender as ComboBox;
    if (cb.SelectedItem != null)
    {
        Show selectedShow = (Show)cb.SelectedItem;
        txtShowname.Text = selectedShow.ShowName;

        icHalfHourBlocks.DataContext = selectedShow.HalfHourItems;
        icHalfHourBlocks.ItemsSource = selectedShow.HalfHourItems;

        gridShowGrid.Visibility = Visibility.Visible;

        ////////////////////////////////////////////////
        Dispatcher.BeginInvoke(new Action(() => 
        {
            IEnumerable<Expander> elements = FindVisualChildren<Expander>(icHalfHourBlocks).Where(x => x.Tag != null && x.Tag.ToString() == "HalfHourBlock");
        }), DispatcherPriority.Render);
        ////////////////////////////////////////////////
    }
}

@ RaceRalph спасибо за ваш совет.

Обновление:

Я нашел лучшее решение в этом случае. Метод UpdateLayout () выполняет обновление дерева визуалов.

private void cbShows_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox cb = sender as ComboBox;
    if (cb.SelectedItem != null)
    {
        Show selectedShow = (Show)cb.SelectedItem;
        txtShowname.Text = selectedShow.ShowName;

        icHalfHourBlocks.DataContext = selectedShow.HalfHourItems;
        icHalfHourBlocks.ItemsSource = selectedShow.HalfHourItems;

        IcHalfHourBlocks.UpdateLayout(); // <-- My new solution

        IEnumerable<Expander> elements = FindVisualChildren<Expander>(icHalfHourBlocks)
            .Where(x => x.Tag != null && x.Tag.ToString() == "HalfHourBlock");

        gridShowGrid.Visibility = Visibility.Visible;
    }
}
0 голосов
/ 07 сентября 2018

... Но изменение ItemsSource влияет на ItemsControl только после EventHandler. Возможно ли получить доступ к элементам в это время?

Вы можете попытаться измерить и упорядочить элемент управления в обработчике событий после того, как вы установили свойства ItemsSource и Visibility:

private void cbShows_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox cb = sender as ComboBox;
    if (cb.SelectedItem != null)
    {
        Show selectedShow = (Show)cb.SelectedItem;
        txtShowname.Text = selectedShow.ShowName;

        icHalfHourBlocks.DataContext = selectedShow.HalfHourItems;
        icHalfHourBlocks.ItemsSource = selectedShow.HalfHourItems;

        gridShowGrid.Visibility = Visibility.Visible;

        ////////////////////////////////////////////////
        // At this Time need the rendered visual tree //
        ////////////////////////////////////////////////
        ic.Measure(new Size(icHalfHourBlocks.ActualWidth, icHalfHourBlocks.ActualHeight));
        ic.Arrange(new Rect(0, 0, icHalfHourBlocks.ActualWidth, icHalfHourBlocks.ActualHeight));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...