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