大量意外 "Cannot retrieve value using the binding" 错误
Lots of unexpected "Cannot retrieve value using the binding" errors
调试我的 wpf 项目时,我看到输出 window 中记录了很多绑定错误,例如:
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
我在谷歌上搜索了很多关于此类消息的信息,并尝试修复所有 my 绑定,但是对于我从未听说过的属性,错误不断发生。
所以我将其分解为一个基本示例:
xaml:
<StackPanel>
<DataGrid ItemsSource="{Binding Items}" x:Name="_grid" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID, FallbackValue=0}"/>
<DataGridTextColumn Header="Text" Binding="{Binding Text, FallbackValue={x:Null}}"/>
</DataGrid.Columns>
</DataGrid>
<Button Click="Button_OnClick">Reset</Button>
</StackPanel>
后面的代码:
public partial class MainWindow
{
public ObservableCollection<TestItem> Items { get; } = new ObservableCollection<TestItem>();
public MainWindow()
{
Items.Add(new TestItem { ID = 1, Text = "One" });
Items.Add(new TestItem { ID = 2, Text = "Two" });
InitializeComponent();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
_grid.ItemsSource = null;
_grid.ItemsSource = Items;
}
}
public class TestItem
{
public int ID { get; set; }
public string Text { get; set; }
}
两个元素在DataGrid
中正确显示。
现在,每当我单击按钮(并重新分配 ItemSource
)时,我都会在输出中看到这 12 条消息 window:
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ID; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=Text; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ValidationErrorTemplate; DataItem=null; target element is 'Control' (Name=''); target property is 'Template' (type 'ControlTemplate')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=(0); DataItem=null; target element is 'Control' (Name=''); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ID; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=Text; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ValidationErrorTemplate; DataItem=null; target element is 'Control' (Name=''); target property is 'Template' (type 'ControlTemplate')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=(0); DataItem=null; target element is 'Control' (Name=''); target property is 'Visibility' (type 'Visibility')
我检查了将 ItemSource
设置回 Items
时出现的错误,而不是设置为 null
时出现的错误。并且错误消息的数量取决于集合中的项目数量。
我担心这些 "binding errors" 会减慢我的实际应用程序(我的集合中可能有 >50k 元素),因此 想了解它们出现的原因以及我如何能够避开它们.
如您所见,我已经为我的绑定添加了回退值,但是对于我根本没有绑定的属性,错误不断出现。
这些绑定错误是无害的,除了修改构成 DataGrid
的元素的默认模板之外,您无能为力地消除它们,这不仅需要相当大的努力,而且它还可能会失去控件的某些内置功能。
你显然应该避免你自己负责的绑定错误,但是当涉及到你从框架 "inherit" 没有自定义任何模板的绑定错误时,你可以安全地忽略它们。大多数这些绑定错误都是无害的,并且已经在内部进行了处理。因此,只需忽略它们,什么也不做或压制它们。详情请参考以下link
解决 WPF 中无害的绑定错误: https://weblogs.asp.net/akjoshi/resolving-un-harmful-binding-errors-in-wpf
调试我的 wpf 项目时,我看到输出 window 中记录了很多绑定错误,例如:
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
我在谷歌上搜索了很多关于此类消息的信息,并尝试修复所有 my 绑定,但是对于我从未听说过的属性,错误不断发生。
所以我将其分解为一个基本示例:
xaml:
<StackPanel>
<DataGrid ItemsSource="{Binding Items}" x:Name="_grid" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID, FallbackValue=0}"/>
<DataGridTextColumn Header="Text" Binding="{Binding Text, FallbackValue={x:Null}}"/>
</DataGrid.Columns>
</DataGrid>
<Button Click="Button_OnClick">Reset</Button>
</StackPanel>
后面的代码:
public partial class MainWindow
{
public ObservableCollection<TestItem> Items { get; } = new ObservableCollection<TestItem>();
public MainWindow()
{
Items.Add(new TestItem { ID = 1, Text = "One" });
Items.Add(new TestItem { ID = 2, Text = "Two" });
InitializeComponent();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
_grid.ItemsSource = null;
_grid.ItemsSource = Items;
}
}
public class TestItem
{
public int ID { get; set; }
public string Text { get; set; }
}
两个元素在DataGrid
中正确显示。
现在,每当我单击按钮(并重新分配 ItemSource
)时,我都会在输出中看到这 12 条消息 window:
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ID; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=Text; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ValidationErrorTemplate; DataItem=null; target element is 'Control' (Name=''); target property is 'Template' (type 'ControlTemplate')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=(0); DataItem=null; target element is 'Control' (Name=''); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=AreRowDetailsFrozen; DataItem=null; target element is 'DataGridDetailsPresenter' (Name=''); target property is 'SelectiveScrollingOrientation' (type 'SelectiveScrollingOrientation')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=HeadersVisibility; DataItem=null; target element is 'DataGridRowHeader' (Name=''); target property is 'Visibility' (type 'Visibility')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ID; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=Text; DataItem=null; target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=ValidationErrorTemplate; DataItem=null; target element is 'Control' (Name=''); target property is 'Template' (type 'ControlTemplate')
System.Windows.Data Information: 10 : Cannot retrieve value using the binding and no valid fallback value exists; using default instead. BindingExpression:Path=(0); DataItem=null; target element is 'Control' (Name=''); target property is 'Visibility' (type 'Visibility')
我检查了将 ItemSource
设置回 Items
时出现的错误,而不是设置为 null
时出现的错误。并且错误消息的数量取决于集合中的项目数量。
我担心这些 "binding errors" 会减慢我的实际应用程序(我的集合中可能有 >50k 元素),因此 想了解它们出现的原因以及我如何能够避开它们.
如您所见,我已经为我的绑定添加了回退值,但是对于我根本没有绑定的属性,错误不断出现。
这些绑定错误是无害的,除了修改构成 DataGrid
的元素的默认模板之外,您无能为力地消除它们,这不仅需要相当大的努力,而且它还可能会失去控件的某些内置功能。
你显然应该避免你自己负责的绑定错误,但是当涉及到你从框架 "inherit" 没有自定义任何模板的绑定错误时,你可以安全地忽略它们。大多数这些绑定错误都是无害的,并且已经在内部进行了处理。因此,只需忽略它们,什么也不做或压制它们。详情请参考以下link
解决 WPF 中无害的绑定错误: https://weblogs.asp.net/akjoshi/resolving-un-harmful-binding-errors-in-wpf