4

我有一个 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>
4

2 回答 2

13

不久前我写了一个关于如何阅读 WPF 绑定错误的答案。基本上,在分号上分解你的错误并从下到上开始阅读它,它应该让你知道绑定错误在哪里:

  • System.Windows.Data 错误:4:
    • 无法通过引用“RelativeSource FindAncestor,AncestorType='System.Windows.Controls.DataGrid',AncestorLevel='1'”找到绑定源。绑定表达式:路径=AreRowDetailsFrozen;
  • 数据项=空;
  • 目标元素是'DataGridDetailsPresenter'(名称='');
  • 目标属性是“SelectiveScrollingOrientation”(输入“SelectiveScrollingOrientation”)

  • System.Windows.Data 错误:4:
    • 无法通过引用“RelativeSource FindAncestor,AncestorType='System.Windows.Controls.DataGrid',AncestorLevel='1'”找到绑定源。BindingExpression:Path=HeadersVisibility;
  • 数据项=空;
  • 目标元素是'DataGridRowHeader'(名称='');
  • 目标属性是“可见性”(类型“可见性”)

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

  • 包含导致错误的绑定的属性是SelectiveScrollingOrientation
  • 包含有问题的属性的 UI 对象是 a DataGridDetailsPresenter,没有指定名称
  • UI对象的DataContext背后是null
  • 绑定试图找到一个RelativeSource类型DataGrid,以便它可以绑定到该AreRowDetailsFrozen属性,但它未能找到RelativeSource

因此,请查看您的代码以查找类似于以下内容的内容:

<DataGridDetailsPresenter SelectiveScrollingOrientation="{Binding 
    Path=AreRowDetailsFrozen, 
    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}" />

第二个错误告诉你

  • 包含导致错误的绑定的属性是Visibility
  • 包含有问题的属性的 UI 对象是 a DataGridRowHeader,没有指定名称
  • UI对象的DataContext背后是null
  • 绑定试图找到一个RelativeSource类型DataGrid,以便它可以绑定到该HeadersVisibility属性,但它未能找到RelativeSource

因此,请查看您的代码以查找类似于以下内容的内容:

<DataGridRowHeader Visibility="{Binding 
    Path=HeadersVisibility, 
    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}" />

根据您发布的代码,第一个可能是您的LeftScrollViewer风格,第二个可能是您的DatagridColumnHeaderCustomTemplateStyle

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

于 2013-03-21T14:20:56.013 回答
1

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

于 2015-05-19T13:54:28.707 回答