WPF DataGrid ContentPresenter绑定错误

时间:2015-05-13 20:37:33

标签: wpf xaml datagrid

我在每个单元格中使用带有组合框的DataGridTemplateColumns的WPF Datagrid。在启动时,输出窗口重复以下消息并延迟启动大约10秒。与ContentPresenter和DataContext无关的东西(DataItem = null)。如果可以的话请帮忙。以下是错误消息:

System.Windows.Data信息:10:无法使用绑定检索值,并且不存在有效的回退值;使用默认值。 BindingExpression :(没有路径);的DataItem = NULL;目标元素是' ContentPresenter' (名称='&#39);目标属性是'内容' (键入'对象')

从技术上讲,这不是一个错误,但它会延迟启动。这是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结构,这些&#34;错误&#34;不要发生,启动速度要快得多。但我更愿意使用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>

修改

查看Visual Tree,我在ControlTemplate中定义的ContentPresenter似乎包含另一个ContentPresenter。 ContentPresenter是无名的,我怀疑是绑定错误的来源。 ContentPresenter的父级是边框。有谁知道如何在ControlTemplate中定义这个ContentPresenter所以我可以添加一个回退值?

我还无法添加可视树的屏幕截图,但这就是它的样子:

  • DataGridCell
    • ContentPresenter(name = DataGridCellPresenter)
      • ContentPresenter(未命名,边框为父级)

0 个答案:

没有答案