绑定错误来自引擎盖下

时间:2014-10-30 12:32:52

标签: c# wpf xaml datagrid

尝试在DataGrid中使用分组,并且没有理由获取这些绑定错误(它们不属于我的代码,也没有找到处理它们的方法):

  

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 ='');目标属性是“可见性”(类型“可见性”)

它们出现在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();
    }
}

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.GroupStyle没有错误;
  • AutoGenerateColumns = true没有错误;
  • 没有绑定(直接设置DataGrid.ItemsSource)没有错误。

只有与这3个条件相反的组合才会开始发送上述消息的Output窗口。

我该怎么办?我不能忽视错误,也没有办法解决错误。

谷歌搜索并不是真的有用,例如,this case被称为错误,我试图应用其变通方法,但没有一个适用于我。

P.S。:首次尝试使用DataGrid时发现此类错误非常令人失望。


尝试处理第二个错误。

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

但错误仍然是

  

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

2 个答案:

答案 0 :(得分: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>

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


我还有一个错误

  

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

我通过将Margin setter添加到DataGrid.RowStyle

来解决此问题
<Setter Property="Margin" Value="0"/>

似乎所有这些错误都可以通过重新分解默认模板来解决。

答案 1 :(得分:0)

首先感谢Sinatr的问题分析和解决方案,这几乎对我有用。 我确实遇到了与DataGrid控件相同的问题。除了输出中的绑定错误之外,新项目行略有位移(在我的情况下,DataRowMargin被两个DIP关闭)。

DataGridRow invalid margin

整个问题是由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>