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

Ray*_*rof 2 c# wpf datagrid

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

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>
Run Code Online (Sandbox Code Playgroud)

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

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')
Run Code Online (Sandbox Code Playgroud)

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

编辑:(关于CoreServiceLogViewCollection的信息)

CoreServiceCollection只是一个ListCollectionView.

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

            return _coreServiceCollection;
        }
    }
Run Code Online (Sandbox Code Playgroud)

参数只是一个ObservableCollection含有ID,Timestamp和其它性质

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

   <ResourceDictionary>
       <x:Static Member="vm2:CoreServiceLogView.CoreServiceLogViewCollection"
                          x:Key="CoreServiceCollection" />
   </ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)

编辑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>
Run Code Online (Sandbox Code Playgroud)

Rac*_*hel 9

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

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

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

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

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

因此,请查看代码中的类似内容:

<DataGridDetailsPresenter SelectiveScrollingOrientation="{Binding 
    Path=AreRowDetailsFrozen, 
    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}" />
Run Code Online (Sandbox Code Playgroud)

第二个错误告诉你

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

因此,请查看代码中的类似内容:

<DataGridRowHeader Visibility="{Binding 
    Path=HeadersVisibility, 
    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}" />
Run Code Online (Sandbox Code Playgroud)

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

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

  • 好吧,这是几年前的事了,但错误对我来说是一样的——但是:1) 我的 XAML 中没有“DataGridRowHeader”或“DataGridDetailsPresenter”的实例——没有;2)这种情况总是发生在某些物品集合上,但不会发生在其他物品集合上;3)当我运行 Snoop 时,它根本不会发生。也许这是最新的 VS 2019 16.6 的一个缺陷?想法值得赞赏... (2认同)