#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 для каждого из создаваемых им элементов.