【问题标题】:Why ItemsControl item's DataContext assigned after they've been rendered为什么 ItemsControl 项的 DataContext 在渲染后分配
【发布时间】:2011-09-03 09:03:58
【问题描述】:

我在 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>

View:MyView 的 DataContext 会在所有 UI 元素呈现后分配。我很想知道,为什么会这样?

【问题讨论】:

  • 您如何确定在呈现元素后分配 DataContext ?这是您可以在 UI 中看到的事情吗?还是您正在处理 DataContextChnaged 事件?
  • 我在调用 InitializeComponent 和 Loaded evenHandler 之前检查了 DataContext。在第一种情况下,它为 null,并且在加载的事件处理程序中,它被分配给正确的 VM。

标签: wpf binding datatemplate itemscontrol


【解决方案1】:

渲染元素后未设置 DataContext。如果是这种情况,您会看到您的元素呈现两次,第一次是在 DataContext 为 null 时,第二次是在设置 DataContext 并评估您的绑定时。

根据您的描述,您在构造函数中设置断点或跟踪。类在构造之前不能设置属性!

【讨论】:

  • 对!那么这意味着构造函数将初始化控件的所有依赖属性?
  • 不完全是 - ItemsControl 负责为其创建的每个元素设置 DataContext。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2016-07-08
  • 2020-12-06
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多