我在每个单元格中使用带有组合框的DataGridTemplateColumns的WPF Datagrid . 在启动时,输出窗口重复以下消息并延迟启动大约10秒 . 与ContentPresenter和DataContext无关的东西(DataItem = null) . 如果可以的话请帮忙 . 这是错误消息:
System.Windows.Data信息:10:无法使用绑定检索值,并且不存在有效的回退值;使用默认值 . BindingExpression :(没有路径);的DataItem = NULL; target元素是'ContentPresenter'(Name =''); target属性是'Content'(类型'Object')
从技术上讲,这不是一个错误,但它会延迟启动 . 这是xaml的一个子集:
<DataGrid x:Name="grid"
AutoGenerateColumns="False"
CanUserAddRows="True"
IsEnabled="True" Grid.Row="1" Grid.Column="0"
EnableRowVirtualization="False"
HorizontalAlignment="Left"
VerticalAlignment="Center"
ScrollViewer.CanContentScroll="True"
GridLinesVisibility="Vertical"
AreRowDetailsFrozen="True"
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Visible"
SelectionMode="Extended"
HeadersVisibility="All"
Height="750"
VirtualizingStackPanel.VirtualizationMode="Standard"
VirtualizingStackPanel.IsVirtualizing="True"
DataContext="{StaticResource vm}"
ItemsSource="{Binding Source={StaticResource vm}, Path=CorpActionAutoPostConfigs, Mode=TwoWay, IsAsync=False}">
<DataGrid.Columns>
<!-- selecteditembinding: source:enum, dest:JournalType -->
<DataGridTemplateColumn Header="JournalType" x:Name="colJournalType">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="cbJournalTypes"
ItemsSource="{Binding Source={StaticResource vm}, Path=JournalTypes, IsAsync=False}"
ItemTemplate="{StaticResource GenericDataTemplate}"
SelectedItem="{Binding Path=JournalTypeCode, Mode=TwoWay, Converter={StaticResource JournalTypeConverter}, IsAsync=False}">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...更多类似的列跟随 . 我觉得我需要设置一个Style或ControlTemplate或者其他东西,但不确定如何继续 .
如果我使用ListView / GridView结构,则不会发生这些“错误”,启动速度会快得多 . 但我更喜欢使用DataGrid .
一个线索是,我似乎得到了生成的每个可见单元格的错误 . 所以我尝试为DataGridCell定义一个样式,它为每个单元格设置控件模板,并包含一个带有后备值的ContentPresenter绑定 . 没有解决错误 .
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridCell" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Border BorderThickness="{TemplateBinding Border.BorderThickness}"
BorderBrush="{TemplateBinding Border.BorderBrush}"
Background="{TemplateBinding Panel.Background}"
SnapsToDevicePixels="True">
<ContentPresenter x:Name="DataGridCellContentPresenter"
Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, FallbackValue=null}"
ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"
SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
EDIT:
看一下Visual Tree,我在ControlTemplate中定义的ContentPresenter似乎包含了另一个ContentPresenter . ContentPresenter是无名的,我怀疑是绑定错误的来源 . ContentPresenter的父级是边框 . 有谁知道如何在ControlTemplate中定义这个ContentPresenter所以我可以添加一个回退值?
我还不能添加可视树的屏幕截图,但这是它的样子:
-
DataGridCell
-
ContentPresenter(name = DataGridCellPresenter)
-
ContentPresenter(未命名,边框为父级)