【问题标题】:How to resolve BindingExpression path errors in Debug Output that don't affect the WPF app?如何解决调试输出中不影响 WPF 应用程序的 BindingExpression 路径错误?
【发布时间】:2014-07-15 15:51:29
【问题描述】:

我的应用程序运行并正确呈现,但我注意到加载窗口时调试输出中有许多错误。对于 Itemscontrol 中的每个项目,相同的 3 个错误加起来为 100 个。

Itemscontrol DataTemplate 有一个 Path 对象,它的 DataContext 绑定到一个属性,该属性通过一个 IValueConverter 传递,该 IValueConverter 返回一个匿名类型,该 Path 对象上的属性绑定到该类型。

<Path Grid.Column="0" Grid.Row="0" Margin="5,1,2,1" StrokeThickness="2"
      DataContext="{Binding Path=Value, Converter={StaticResource ShapeConverter},
                            IsAsync=True}" >
    <Path.Data>
        <Binding Path="Data" IsAsync="True" />
    </Path.Data>
    <Path.Fill>
        <Binding Path="Fill" IsAsync="True" />
    </Path.Fill>
    <Path.Stroke>
        <Binding Path="Stroke" IsAsync="True" />
    </Path.Stroke>
</Path>

ShapeConverter 是一个返回要绑定的匿名类型的 IValueConverter。

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int status = System.Convert.ToInt32(value);
        var geometry = CreateShapeGeometry(status);
        var strokecolor = GetStrokeColor(status);
        var fillcolor = GetFillColor(status);

        return new
        {
            Data = PathGeometry.CreateFromGeometry(geometry).ToString(),
            Stroke = strokecolor,
            Fill = fillcolor
        };
    }

我理解错误的含义,因为它正在寻找的属性在警报上不存在,它们存在于它正确解析和呈现的匿名类型上。

我不明白的是如何解决实际上不是错误的 BindingExpression 路径错误。我也想知道这是否会导致屏幕加载缓慢。

以下是错误:

(总结) BindingExpression 路径错误:“Fill”、“Stroke”、“Data”属性未在对象 Alarm 上找到。

(实际) System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“警报”(HashCode = 37465686)上找不到“填充”属性。绑定表达式:路径=填充; DataItem='报警' (HashCode=37465686);目标元素是'路径'(名称='');目标属性是“填充”(输入“画笔”)

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“警报”(HashCode=37465686)上找不到“Stroke”属性。绑定表达式:路径=描边; DataItem='报警' (HashCode=37465686);目标元素是'路径'(名称='');目标属性是'Stroke'(类型'Brush')

System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“警报”(HashCode=37465686)上找不到“数据”属性。绑定表达式:路径=数据; DataItem='报警' (HashCode=37465686);目标元素是'路径'(名称='');目标属性是“数据”(类型“几何”)

经过一些修补后,我不确定这个问题是否与匿名类型有关。我改变了转换方法如下,但它没有改变我的输出。

 public class Foo
{
    public string Data { get; set; }
    public SolidColorBrush Stroke { get; set; }
    public SolidColorBrush Fill { get; set;  }
}

转换方法

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int status = System.Convert.ToInt32(value);
        var geometry = CreateShapeGeometry(status);
        var strokecolor = GetStrokeColor(status);
        var fillcolor = GetFillColor(status);

        Foo f = new Foo { Data = PathGeometry.CreateFromGeometry(geometry).ToString(), Stroke = strokecolor, Fill = fillcolor };

        return f;
    }

【问题讨论】:

  • 减速只会在DEBUG模式下发生,在发布模式下几乎不会因为错误而影响性能
  • @thumbmunkeys 它们是我需要关注的实际错误吗?对他们来说有一个 surpress 标签吗?我只是在为必须向构建经理解释它们的可能性做准备。
  • 问题是为什么Alarm 对象在任何时候都是DataContext,如果你能避免你不会得到任何错误。
  • @H.B.我想也许它是从 DataTemplate 声明中得到的。 但即使我取出 DataType 属性后,消息也是一样的。
  • @jrandomuser: DataType 仅在您不设置 x:Key 时才重要(然后使用基于类型的隐式应用程序)。顺便说一句,您可以对这三个属性绑定使用属性表示法(例如Data="{Binding Data}"),此外:使用IsAsync 毫无意义,因为一旦转换器代码返回,所有三个属性都可以立即访问。

标签: c# wpf xaml data-binding


【解决方案1】:

那里有大量资源讨论绑定错误会降低应用性能。

见 7 号 - http://blogs.msdn.com/b/visualstudio/archive/2010/03/02/wpf-in-visual-studio-2010-part-2-performance-tuning.aspx

【讨论】:

  • Sorta 但这一切只是控制问题在输出中显示的级别。我知道它们是什么,只是不知道它们为什么或如何解决它们。
  • 为什么要使用匿名,为什么不将“Value”属性绑定到每个 Path.Data、Path.Fill 和 Path.Stroke 中,每个都有自己的转换器。就个人而言,我会尝试一起删除转换器的使用。
  • 我在这里完成了翻译,因为 ViewModel 本身没有任何形状或颜色等概念。ViewModel 所知道的只是它有一个状态为 X 的警报。我可以将其中的很多内容移到 ViewModel 中,但是 View 的大部分内容是由状态决定的,如果我在 VM 上创建可绑定的属性,我会有几十个。我必须为边框颜色、背景颜色、关联的故事板、字体粗细、文本颜色、父边框颜色等制作一个...
  • 我不建议将这些属性放在 VM 上,我建议为您想要“转换”Value 属性的每种方式使用转换器
  • 我明白了。我以前有过,并认为将适用于单个元素的组合在一起可能会更好。我可能不得不把它们弄回来。我开始认为需要完全信任才能正确绑定匿名类型是一个问题,但经过最近的测试,我认为这与匿名类型根本没有任何关系。我正在用我发现的内容更新问题。
【解决方案2】:

最后我发现,虽然您可以创建并绑定到匿名类型的属性,甚至是从值转换器返回的已定义类的实例,但在执行绑定时会遇到但要克服调试错误。

在这种情况下,另一种方法是创建一组样式而不是作为静态资源,然后绑定 Path 对象的 Style 属性。见Binding for WPF Styles

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多