当前位置: 首页 > 知识库问答 >
问题:

来自引擎盖下的绑定错误

路裕
2023-03-14

尝试在DataGrid中使用分组,并且没有任何原因得到这些绑定错误(它们不属于我的代码,我也看不到处理它们的方法):

System. Windows. Data错误:4:找不到引用“RelativeSource FindAncestor, AncestorType=”System. Windows. Control. DataGrid', AncestorLine=“1”的绑定源。Binding表达式:路径=区域详细信息冻结;数据项目=null;目标元素是“DataG的详细信息演示者”(名称=");目标属性是“S审视方向”(类型“选择方向”)

系统。Windows.Data错误:4:找不到引用为“RelativeSource FindAncestor,ancestor type =”System的绑定的源。Windows.Controls.DataGrid ',AncestorLevel='1 ' '。binding expression:Path = headers visibility;DataItem = null目标元素是“DataGridRowHeader”(名称=“”);目标属性为“Visibility”(类型为“Visibility”)

它们针对数据网格中的每一行显示。这让我很烦恼!

为了重现问题,我做了一个小项目

public class MyItem
{
    public string A { get; set; }
}

public class ViewModel
{
    public List<MyItem> List { get; set; }

    public ViewModel()
    {
        List = new List<MyItem>(new[] { new MyItem() });
    }
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new ViewModel();
    }
}

XAML

<DataGrid ItemsSource="{Binding List}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding A}" Header="A"/>
    </DataGrid.Columns>
    <DataGrid.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="GroupItem">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="GroupItem">
                                <!-- anything or nothing here -->
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </DataGrid.GroupStyle>
</DataGrid>

一些观察结果:

  • 没有DataGrid. Group样式就没有错误;
  • 使用自动生成列=true没有错误;
  • 没有绑定(直接设置DataGrid. ItemsSource)就没有错误。

只有与这 3 个条件相反的组合才会开始向带有上述消息的输出窗口发送垃圾邮件。

我该怎么办?我不能忽略错误,也看不到修复它们的方法。

谷歌搜索并没有什么帮助,例如,这个案例被称为错误,我试图应用它的变通方法,但没有一个对我有用。

注:第一次尝试使用<code>DataGrid</code>时发现这样的bug是非常令人沮丧的。

试图处理第二个错误。

<DataGrid.RowHeaderStyle>
    <Style TargetType="DataGridRowHeader">
        <Setter Property="Visibility" Value="Collapsed"/>
        <Setter Property="Template" Value="{x:Null}"/>
    </Style>
</DataGrid.RowHeaderStyle>

但错误仍然存在

系统。Windows.Data错误:4:找不到引用为“RelativeSource FindAncestor,ancestor type =”System的绑定的源。Windows.Controls.DataGrid ',AncestorLevel='1 ' '。binding expression:Path = headers visibility;DataItem = null目标元素是“DataGridRowHeader”(名称=“”);目标属性为“Visibility”(类型为“Visibility”)

共有2个答案

葛季萌
2023-03-14

首先感谢Sinatr的问题分析和解决方案,这几乎对我有用。我对DataGrid控件也有同样的问题。除了输出中的绑定错误之外,新条目行还有一点位移(在我的例子中,DataRowMargin偏离了两次)。

DataGridRow无效边距

整个问题是由当IsNewItemProperty等于true时激活的样式触发器引起的,DataGridRow没有获得正确的边距值。Sinatr的回答确实解决了绑定问题,但仍然使用了错误的边距。这种样式消除了绑定错误并设置了正确的边距。

<Style TargetType="DataGridRow">
    <Setter Property="Margin" Value="0,0,0,0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="DataGridRow">
                <Border BorderThickness="{TemplateBinding Border.BorderThickness}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="DGR_Border" SnapsToDevicePixels="True">
                    <SelectiveScrollingGrid>
                        <DataGridCellsPresenter ItemsPanel="{TemplateBinding ItemsControl.ItemsPanel}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"/>
                    </SelectiveScrollingGrid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsNewItem" Value="True">
            <Setter Property="Margin" Value="1,0,0,0"/>
        </Trigger>
    </Style.Triggers>
</Style>
汪鸿波
2023-03-14

正在使用控件模板,在为< code>DataGridRow更改一个模板后,错误消失了!

<DataGrid.RowStyle>
    <Style TargetType="DataGridRow">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="DataGridRow">
                    <Border BorderThickness="{TemplateBinding Border.BorderThickness}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Name="DGR_Border" SnapsToDevicePixels="True">
                        <SelectiveScrollingGrid>
                            <DataGridCellsPresenter ItemsPanel="{TemplateBinding ItemsControl.ItemsPanel}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"/>
                        </SelectiveScrollingGrid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.RowStyle>

我从默认模板中删除了DataGridDetailsPresenterDataGridRowHeader,因为我不会使用它们。

我还有一个错误

系统。Windows.Data错误:4:找不到引用为“RelativeSource FindAncestor,ancestor type =”System的绑定的源。Windows.Controls.DataGrid ',AncestorLevel='1 ' '。binding expression:Path = new item margin;DataItem = null目标元素是“DataGridRow”(名称=“”);目标属性是“边距”(类型为“厚度”)

我通过将Marginsetter添加到DataGrid.RowStyle中来解决这个问题

<Setter Property="Margin" Value="0"/>

似乎所有这些错误都可以通过重构默认模板来修复。

 类似资料:
  • 问题内容: 在阅读了戴夫·切尼(Dave Cheney)关于Go的地图的博客文章之后,对我来说,还有几件事尚不清楚。 TLDR: 为什么它们无序? 实际值存储在哪里? 深入研究运行时程序包后,我发现基本的映射结构如下: -是存储区数组,其中索引是键的哈希值的低位,其中存储区为: ..好吧,这只是每个项目是键的哈希值的第一个字节的数组。键值对存储为(每个存储桶八对)。但是到底在哪里?考虑到映射可能包

  • 我必须评估Codename One,但我找不到关于部署在底层是如何工作的以及最终结果是什么的信息。他们是否将我的Java代码交叉编译为类似于RoboVM的真实本机代码,他们是否使用类似于Gluon的JVM,或者他们有自己的JVM?

  • 除了阅读github中的代码之外,是否有关于signalr.redis包如何工作的白皮书类型的文档?具体地说,我想知道它为Redis添加了哪些键、更新/删除策略等。当查看Redis内部时,我只看到以下调用中指定的一个键(即“signalr.Redis.sample”): 这把钥匙好像是Redis的柜台。我假设正在创建其他键并迅速删除,以方便连接到Redis的每个应用服务器之间的消息。

  • 问题内容: 我一直在尝试React Hooks,它们似乎确实简化了诸如存储状态之类的事情。但是,他们似乎通过魔术来做很多事情,而我找不到关于它们实际工作方式的好文章。 看起来很神奇的第一件事是,每次调用setXXX方法时,调用诸如useState()之类的函数如何导致功能组件的重新渲染? 当功能组件甚至没有能力在Mount / Unmount上运行代码时,诸如useEffect()之类的东西如何伪

  • Java的switch语句是如何工作的?它如何将所使用变量的值与案例部分中给出的值进行比较?它是否使用或,还是完全是其他原因? 我主要对1.7之前的版本感兴趣。

  • 我们在开发中可能会遇到诸如404,500这样的错误,在Blade中默认是打印这些错误到页面上, 当你在非开发者模式下错误会输出在控制台,当然你可以自定义这些页面。 自定义404页面 配置 mvc.view.404=error_404.html 这时候框架会去classpath下的templates目录下寻找error_404.html这个文件。 自定义500页面 配置 mvc.view.500=e