Почему DataContext элемента ItemsControl назначается после их визуализации

#wpf #binding #datatemplate #itemscontrol

#wpf #привязка #datatemplate #itemscontrol

Вопрос:

У меня в моем XAML определен следующий ItemsControl:

 <UserControl.Resources>
    <DataTemplate x:Key="myDataTemplate">
        <Grid Margin="20">

            <View:MyView Width="123" Height="212"/>

        </Grid>
    </DataTemplate>
</UserControl.Resources>

<Grid>
    <ItemsControl ItemsSource="{Binding MyVMs}" ItemTemplate="{StaticResource myDataTemplate}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    </ItemsControl>
</Grid>
  

И DataContext элемента View:MyView присваивается после того, как все элементы пользовательского интерфейса были визуализированы. Мне интересно знать, почему это происходит?

Комментарии:

1. Как вы определяете, что DataContext назначается после рендеринга элементов? это то, что вы можете видеть в пользовательском интерфейсе? или вы обрабатываете событие DataContextChnaged?

2. Я проверяю DataContext перед вызовом InitializeComponent и в загруженном evenHandler. В первом случае это значение равно null, и в загруженном обработчике событий оно было назначено правильной виртуальной машине.

Ответ №1:

DataContext не устанавливается после визуализации элементов. Если бы это было так, вы бы увидели, что ваши элементы отображаются дважды, один раз изначально, когда DataContext равен null, и второй раз, когда DataContext установлен и ваши привязки оценены.

Из того, что вы описываете, вы указываете точку останова или трассируете внутри конструктора. Свойства не могут быть установлены для класса до их создания!

Комментарии:

1. Правильно! То есть это означает, что конструктор инициализирует все свойства зависимостей элемента управления?

2. Не совсем так — ItemsControl отвечает за установку DataContext для каждого из создаваемых им элементов.