WPF Datagrid [System.Windows.Data错误:4]

时间:2013-03-21 13:15:40

标签: c# wpf datagrid

我有一个DataGrid的WPF应用程序,如下所示:

Datagrid(简化):

<DataGrid x:Name="CoreServiceLogDataGrid"
Grid.Row="0"
Height="auto"
ItemsSource="{Binding Source={StaticResource CoreServiceCollection}}"
AutoGenerateColumns="False"
CanUserReorderColumns="True"
CanUserSortColumns="True"
IsReadOnly="True">

    <DataGrid.Columns>
        <DataGridTextColumn x:Name="ID"
            Header="ID"
            Binding="{Binding ID}" />

        <DataGridTextColumn Binding="{Binding Timestamp}"
            Header="Timestamp" />

    </DataGrid.Columns>

</DataGrid>

加载数据时;我收到以下错误(无数次):

System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.DataGrid', AncestorLevel='1''. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility')

我不知道为什么会发生这种情况以及如何解决这个问题。

编辑:(关于CoreServiceLogViewCollection的信息)

CoreServiceCollection只是一个ListCollectionView。

  public static ListCollectionView CoreServiceLogViewCollection {
        get {
            if (_coreServiceCollection == null) {
                _coreServiceCollection =
                    new ListCollectionView(LogSession.CoreServiceLogCollection);
            }

            return _coreServiceCollection;
        }
    }

参数只是一个ObservableCollection,其中包含IDTimestamp和其他属性

EDIT2: 实例化在App.xaml中完成:

   <ResourceDictionary>
       <x:Static Member="vm2:CoreServiceLogView.CoreServiceLogViewCollection"
                          x:Key="CoreServiceCollection" />
   </ResourceDictionary>

编辑3(风格......)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                mc:Ignorable="d">


<!-- #columnHeaderDGStyle -->


<!-- Datagrid -->
<Style x:Key="Log4NetDataGridStyle"
       TargetType="DataGrid">

    <Setter Property="ColumnHeaderStyle"
            Value="{DynamicResource DatagridColumnHeaderCustomTemplateStyle}" />


    <Setter Property="RowStyle"
            Value="{DynamicResource Log4NetRowStyle}" />

    <Setter Property="RowDetailsTemplate"
            Value="{DynamicResource RowDetailsTemplate}" />

    <Setter Property="MaxHeight"
            Value="1600">
    </Setter>
    <Setter Property="MaxWidth"
            Value="2560">
    </Setter>


</Style>


<Style x:Key="DataCommuGridStyle"
       TargetType="DataGrid">

    <Setter Property="ColumnHeaderStyle"
            Value="{DynamicResource DatagridColumnHeaderCustomTemplateStyle}" />


    <Setter Property="RowStyle"
            Value="{DynamicResource CommuRowStyle}" />

    <Setter Property="RowDetailsTemplate"
            Value="{DynamicResource RowDetailsTemplate}" />

    <Setter Property="MaxHeight"
            Value="1600">
    </Setter>
    <Setter Property="MaxWidth"
            Value="2560">
    </Setter>


</Style>


<!-- ************************* Row Style ************************* -->
<Style x:Key="Log4NetRowStyle"
       TargetType="DataGridRow">

    <Setter Property="FontSize"
            Value="14" />

    <Setter Property="Background"
            Value="{Binding Path=LogColour.ColorName}" />

    <Setter Property="Height"
            Value="Auto">
    </Setter>

    <Style.Triggers>
        <DataTrigger></DataTrigger>
    </Style.Triggers>

</Style>

<Style x:Key="CommuRowStyle"
       TargetType="DataGridRow">

    <Setter Property="FontSize"
            Value="14" />

    <Setter Property="Background"
            Value="Azure" />

    <Setter Property="Height"
            Value="Auto">
    </Setter>

    <Style.Triggers>
        <DataTrigger></DataTrigger>
    </Style.Triggers>

</Style>


<DataTemplate x:Key="RowDetailsTemplate">
    <Border BorderThickness="0"
            Padding="5" >


        <Border.Background>
            <LinearGradientBrush StartPoint="0,0"
                                 EndPoint="0,1" Opacity="0.2">
                <GradientStop Color="White"
                              Offset="0" />
                <GradientStop Color="Black"
                              Offset="1" />
            </LinearGradientBrush>

        </Border.Background>


        <!-- alternative with Expancer -->
        <Expander IsExpanded="True"
                  HorizontalAlignment="Left"
                  BorderThickness="1,1,1,5"
                  MaxHeight="300"
                  MaxWidth="900">

            <Expander.Header>
                <DockPanel>
                    <TextBlock FontSize="12"
                               Text="LoggingMessage: "
                               VerticalAlignment="Center" />
                </DockPanel>
            </Expander.Header>

            <Expander.Content>
                <ScrollViewer VerticalScrollBarVisibility="Auto"
                              HorizontalScrollBarVisibility="Auto"
                              CanContentScroll="True"
                              Style="{StaticResource LeftScrollViewer}">
                    <StackPanel Orientation="Vertical">

                        <TextBox FontSize="16"
                                 BorderThickness="0"
                                 IsReadOnly="True"
                                 Background="Transparent"
                                 Foreground="Black"
                                 TextWrapping="Wrap"
                                 Text="{Binding LoggingMessage, Mode=OneWay}" />
                    </StackPanel>
                </ScrollViewer>
            </Expander.Content>
        </Expander>


    </Border>


</DataTemplate>


<Style x:Key="GroupHeaderStyle"
       TargetType="{x:Type GroupItem}">
    <Setter Property="Margin"
            Value="0,0,0,5" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Expander IsExpanded="False"
                          Background="#FF112255"
                          BorderBrush="#FF002255"
                          Foreground="Black"
                          BorderThickness="1,1,1,5">
                    <Expander.Header>
                        <DockPanel>
                            <TextBlock FontWeight="Bold"
                                       Foreground="White"
                                       Text="{Binding Path=Name}"
                                       Margin="5,0,0,0"
                                       Width="100" />
                            <TextBlock FontWeight="Bold"
                                       Foreground="White"
                                       Text="{Binding Path=ItemCount}" />
                        </DockPanel>
                    </Expander.Header>

                    <Expander.Content>
                        <ItemsPresenter />
                    </Expander.Content>
                </Expander>


            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


<!-- ******************** DataTemplate ******************** -->


</ResourceDictionary>

2 个答案:

答案 0 :(得分:9)

前段时间我写了一篇关于how to read WPF binding errors的答案。基本上,分解你在分号上的错误并从下往上开始阅读它,它应该让你知道绑定错误在哪里:

  • System.Windows.Data错误:4:
    • 无法找到与引用'RelativeSource FindAncestor绑定的源,AncestorType ='System.Windows.Controls.DataGrid',AncestorLevel ='1''。 BindingExpression:路径= AreRowDetailsFrozen;
  • 的DataItem = NULL;
  • 目标元素是'DataGridDetailsPresenter'(Name ='');
  • 目标属性为'SelectiveScrollingOrientation'(类型'SelectiveScrollingOrientation')

  • System.Windows.Data错误:4:
    • 无法找到与引用'RelativeSource FindAncestor绑定的源,AncestorType ='System.Windows.Controls.DataGrid',AncestorLevel ='1''。 BindingExpression:路径= HeadersVisibility;
  • 的DataItem = NULL;
  • 目标元素是'DataGridRowHeader'(Name ='');
  • 目标属性为“可见性”(类型为“可见性”)

从下往上阅读,第一个错误告诉你

  • 包含导致错误的绑定的属性为SelectiveScrollingOrientation
  • 包含有问题属性的UI对象是DataGridDetailsPresenter,未指定名称
  • UI对象后面的DataContextnull
  • 绑定正在尝试查找类型为RelativeSource的{​​{1}},因此它可以绑定到DataGrid属性,并且无法找到AreRowDetailsFrozen

请仔细查看您的代码:

RelativeSource

第二个错误告诉你

  • 包含导致错误的绑定的属性为<DataGridDetailsPresenter SelectiveScrollingOrientation="{Binding Path=AreRowDetailsFrozen, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}" />
  • 包含有问题属性的UI对象是Visibility,未指定名称
  • UI对象后面的DataGridRowHeaderDataContext
  • 绑定正在尝试查找类型为null的{​​{1}},因此它可以绑定到RelativeSource属性,并且无法找到DataGrid

请仔细查看您的代码:

HeadersVisibility

根据您发布的代码,第一个代码可能位于RelativeSource样式中,第二个代码可能位于<DataGridRowHeader Visibility="{Binding Path=HeadersVisibility, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}" />

如果您在XAML中发现错误时遇到问题,可以尝试运行应用程序并使用Snoop等工具检查它,这样可以让您在运行时查看WPF应用程序的VisualTree,并且应该能够在那里找到确切的绑定错误,以便您可以将其追溯到XAML中的源

答案 1 :(得分:0)

DataGridRow的ControlTemplate中发生此错误,该DataGridRow包含DataGridRowHeader和带有上述绑定的DataGridDetailsPresenter。我在.NET 4.5 DataGrid中遇到了同样的问题。似乎只有在DataGrid为其项目使用虚拟化时才会出现这两个错误,您可以尝试在DataGrid中禁用它。在我看来,当DataGridRow在虚拟化过程中以某种方式与它的DataGrid连接/分离时,会发生这种情况,然后绑定失去或者仍然没有找到DataGrid的相对绑定目标。