数据模板绑定垃圾邮件输出窗口错误:无法找到治理框架元素

本文关键字:元素 框架 错误 窗口 绑定 输出 数据 | 更新日期: 2023-09-27 18:17:02

我有问题

System.Windows。数据错误:2:找不到目标元素的框架元素或框架内容元素。BindingExpression:(没有路径);DataItem =零;目标元素是'SolidColorBrush' (HashCode=48519443);目标属性为"Color"(类型为"Color")

可以用以下代码复制:

<Window PreviewKeyDown="Window_PreviewKeyDown"
        xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase"
        ... >
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:ViewModel}">
            <ListBox ItemsSource="{Binding List}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Border Width="20" Height="20">
                            <Border.Background>
                                <SolidColorBrush Color="{Binding diag:PresentationTraceSources.TraceLevel=High}" />
                            </Border.Background>
                        </Border>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </DataTemplate>
    </Window.Resources>
    <ContentControl Content="{Binding}" />
</Window>

和cs:

public class ViewModel
{
    public List<Color> List { get; } = new List<Color> { Colors.Red, Colors.Blue, Colors.Green, Colors.Black, Colors.Yellow };
}
public partial class MainWindow : Window
{
    readonly ViewModel _vm = new ViewModel();
    public MainWindow()
    {
        InitializeComponent();
    }
    void Window_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.Key == Key.F1)
            DataContext = _vm;
        if (e.Key == Key.F2)
            DataContext = null;
    }
}

开始,按F1并检查Output窗口(绑定跟踪已启用,因此您将看到更多)。

问题:我该如何修复它们?

错误不会导致功能问题,但它们出现在Output窗口中(并且在实际项目中有很多),这已经是一些问题的标志。哪个问题?

这里的关键是要有数据模板并在一段时间后应用它,那么数据模板中的这个绑定将会导致问题。在构造函数中设置DataContext不会引起问题。

这里有一些痕迹,如果有人能理解它并能给出一些提示:

System.Windows.Data Warning: 56 : Created BindingExpression (hash=45377043) for Binding (hash=28932383)
System.Windows.Data Warning: 58 :   Path: ''
System.Windows.Data Warning: 60 : BindingExpression (hash=45377043): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=45377043): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=45377043): Attach to System.Windows.Media.SolidColorBrush.Color (hash=48519443)
System.Windows.Data Warning: 64 : BindingExpression (hash=45377043): Use Framework mentor <null>
System.Windows.Data Warning: 67 : BindingExpression (hash=45377043): Resolving source 
System.Windows.Data Warning: 69 : BindingExpression (hash=45377043): Framework mentor not found
System.Windows.Data Warning: 65 : BindingExpression (hash=45377043): Resolve source deferred
...
System.Windows.Data Warning: 67 : BindingExpression (hash=45377043): Resolving source 
System.Windows.Data Warning: 69 : BindingExpression (hash=45377043): Framework mentor not found
System.Windows.Data Warning: 67 : BindingExpression (hash=45377043): Resolving source 
System.Windows.Data Warning: 69 : BindingExpression (hash=45377043): Framework mentor not found
System.Windows.Data Warning: 67 : BindingExpression (hash=45377043): Resolving source  (last chance)
System.Windows.Data Warning: 69 : BindingExpression (hash=45377043): Framework mentor not found
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:(no path); DataItem=null; target element is 'SolidColorBrush' (HashCode=48519443); target property is 'Color' (type 'Color')
当datatemplate创建元素时,mentor没有被找到(什么是mentor?),所以绑定创建被延迟了。然后重复几次,并以给定的误差失败。但在最后它工作了,也许它继续重复而不追踪它?什么好主意吗?

数据模板绑定垃圾邮件输出窗口错误:无法找到治理框架元素

不幸的是,我不能详细说明绑定错误发生的原因以及绑定最终成功的原因,但也许我能解释一下。

似乎是这样的:

因为您在使用绑定时没有指定源,所以默认情况下框架会尝试使用目标上的FrameworkElement.DataContextFrameworkContentElement.DataContext属性作为绑定的源。这显然是失败的,因为SolidColorBrush都不是由此产生的。此外,由于SolidColorBrush既不是可视树的一部分,也不是逻辑树的一部分,因此不能将其绑定回Border,因此框架无法解析绑定的源。虽然不确定是如何发生的,但在某些时候,源被解析并且绑定正常工作。

然而,这个问题有一个解决方案,它是专门为解决这种情况而引入的,它使用可视或逻辑树以外的方法来解析绑定源。您所需要做的就是将SolidColorBrush定义为资源:

<Border Width="20" Height="20">
    <Border.Resources>
        <SolidColorBrush x:Key="BackgroundBrush" Color="{Binding}" />
    </Border.Background>
    <Border.Background>
        <StaticResource ResourceKey="BackgroundBrush" />
    </Border.Background>
</Border>

通过这样做,您可以在跟踪中获得一个主要区别,这似乎是不获得Error: 2:

的关键。
...
System.Windows.Data Warning: 65 : BindingExpression (hash=38517915): Resolve source deferred
System.Windows.Data Warning: 95 : BindingExpression (hash=38517915): Got InheritanceContextChanged event from SolidColorBrush (hash=55584612)
...

此解决方案不仅适用于SolidColorBrush,而且适用于任何从Freezable派生的类型对象(画笔,变换等)

您必须小心,因为它使在您放置Freezable的资源字典中有所不同。如果你把它放在Window.Resources字典中,源将解析为Window.DataContext(在你的例子中是ViewModel实例)。

我的最后一个假设是,如果您使用这种技术,那么在Freezable上设置的绑定就会像在资源字典所有者(顺便说一下,我认为它被称为mentorgoverning元素)上设置一样被解析。这也适用于使用RelativeSourceElementName的绑定。