来自引擎盖下的绑定错误

Sin*_*atr 5 c# wpf xaml datagrid

尝试使用分组DataGrid并且无缘无故地出现这些绑定错误(它们不属于我的代码,我也没有找到处理它们的方法):

System.Windows.Data 错误:4:无法找到引用“RelativeSource FindAncestor、AncestorType='System.Windows.Controls.DataGrid'、AncestorLevel='1”的绑定源。BindingExpression:Path=AreRowDetailsFrozen; 数据项=空;目标元素是“DataGridDetailsPresenter”(名称=“”);目标属性是“SelectiveScrollingOrientation”(类型“SelectiveScrollingOrientation”)

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

它们出现在 中的每一行DataGrid。这让我很烦恼!

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

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

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

一些观察结果:

  • 没有DataGrid.GroupStyle则没有错误;
  • 没有AutoGenerateColumns = true错误;
  • 没有绑定(DataGrid.ItemsSource直接设置)就没有错误。

只有与这 3 个条件相反的组合才会启动Output包含上述消息的垃圾邮件窗口。

我应该怎么办?我无法忽视错误,也找不到修复它们的方法。

谷歌搜索并没有多大帮助,例如,这种情况被称为错误,我尝试应用它的解决方法,但没有一个对我有用。

PS:第一次尝试使用时发现此类错误DataGrid是非常令人沮丧的。


尝试处理第二个错误。

<DataGrid.RowHeaderStyle>
    <Style TargetType="DataGridRowHeader">
        <Setter Property="Visibility" Value="Collapsed"/>
        <Setter Property="Template" Value="{x:Null}"/>
    </Style>
</DataGrid.RowHeaderStyle>
Run Code Online (Sandbox Code Playgroud)

但错误仍然存​​在

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

Sin*_*atr 4

正在使用控制模板,更改后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>
Run Code Online (Sandbox Code Playgroud)

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


我又遇到一个错误

System.Windows.Data 错误:4:无法找到引用“RelativeSource FindAncestor、AncestorType='System.Windows.Controls.DataGrid'、AncestorLevel='1”的绑定源。BindingExpression:Path=NewItemMargin; 数据项=空;目标元素是“DataGridRow”(名称=“”);目标属性是“边距”(类型“厚度”)

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

<Setter Property="Margin" Value="0"/>
Run Code Online (Sandbox Code Playgroud)

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