【问题标题】:ItemsControl not showing without DataContext binding没有 DataContext 绑定的 ItemsControl 不显示
【发布时间】:2020-04-04 01:50:36
【问题描述】:

我有一个 DataContext 设置为我的视图模型实例的窗口。我的视图模型有一个自定义类的属性“SelectedFile”。该自定义类具有 ObservableCollection 类型的属性“RevHistory”,其中 Revision 是具有一些字符串属性的自定义类。 RevHistory 被初始化为固定大小。我的窗口有一个带有 ItemsControl 的部分,如下所示(删除了额外的内容)

<Window>
<Grid Grid.IsSharedSizeScope="True">
    ...
    <Border Grid.Column="1" Grid.Row="3" Grid.RowSpan="3" BorderBrush="{x:Static SystemColors.ControlDarkBrush}" BorderThickness="2" Margin="0,0,5,5" CornerRadius="3">
        <Grid>
        ...
            <ScrollViewer DataContext="{Binding SelectedFile, Mode=TwoWay}" Grid.Row="1" Margin="5" HorizontalAlignment="Stretch" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto" VerticalAlignment="Top">
                <Grid>
                    ...
                    <Border Grid.Row="1" Grid.Column="0" BorderThickness="1,0,0,0" BorderBrush="{x:Static SystemColors.ActiveBorderBrush}">
                        <ItemsControl ItemsSource="{Binding RevHistory}">
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <TextBox BorderThickness="0,0,0,1" Text="{Binding Rev}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" TextAlignment="Center" Padding="2"/>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </Border>
                    ...
                </Grid>
            </ScrollViewer>
            ...
        </Grid>
    </Border>
</Grid>

我无法理解的是为什么它只在 ScrollViewer 上进行 DataContext 绑定时才有效。 ScrollViewer 是否会阻止进一步的 DataContext 继承?使用 ItemsControl ItemSource={Binding SelectedFile.RevHistory} 不会显示任何项目。从 ItemsControl 向上走可视化树,ScrollViewer 是绑定 DataContext 起作用的第一个位置。

【问题讨论】:

  • 为什么不能将ItemsControlDataContext 设置为SelectedFile
  • 如果在设置 DataContext 的 ScrollViewer 和 ItemsControl 之间的层次结构中没有其他元素,则从 ScrollViewer 中删除 DataContext 分配并设置 ItemSource="{Binding SelectedFile.RevHistory}" 必须有效。不应有任何明确的 DataContext 分配,除了顶层的分配,即窗口。请尝试提供一个可重现的最小示例。
  • @AbinMathew 我无法让它工作。在使用单一视图模型时,我通常会按照 Clemens 的建议设置窗口的 DataContext。我认为这可能是一个通知问题,但视图模型实例在设置为 DataContext 之前包含空白数据,所以它应该显示一些东西。我会努力发布一个完整的例子。
  • @Clemens 我的“slim”版本实际上按预期工作,所以我回到了我原来的项目。目前,删除 XAML 中的 Window.DataContext 条目使其正常工作。我认为它只是帮助绑定自动完成的类型参考,但我想它的作用不止于此。我在一些地方使用了参数化构造函数,但确保所有东西都有一个无参数构造函数并没有帮助。

标签: wpf binding datacontext itemscontrol


【解决方案1】:

这种情况经常发生在我身上。我猜问题是当 SelectedItem 为空时,您会得到空引用异常,该异常会被控件吃掉。

如果您将DataContext={Binding SelectedItem}ScrollViewer 移动到ItemsControl,它应该可以工作。

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 2014-07-30
    • 2010-12-03
    • 2011-12-04
    • 2011-02-03
    • 2012-02-08
    • 2012-03-26
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多