尝试在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 ='');目标属性是“可见性”(类型“可见性”)
答案 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>
我从默认模板中删除了DataGridDetailsPresenter
和DataGridRowHeader
,因为我不会使用它们。
我还有一个错误
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关闭)。
整个问题是由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>