Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解决调试输出中没有';不影响WPF应用程序?_C#_Wpf_Xaml_Data Binding - Fatal编程技术网

C# 如何解决调试输出中没有';不影响WPF应用程序?

C# 如何解决调试输出中没有';不影响WPF应用程序?,c#,wpf,xaml,data-binding,C#,Wpf,Xaml,Data Binding,我的应用程序运行和渲染正确,但在加载窗口时,我注意到调试输出中有许多错误。Itemscontrol中的每个项都有相同的3个错误,总计为100 Itemscontrol数据模板有一个Path对象,该对象的DataContext绑定到一个属性,该属性通过IValueConverter传递,该属性返回一个匿名类型,该Path对象上的属性绑定到该匿名类型 <Path Grid.Column="0" Grid.Row="0" Margin="5,1,2,1" StrokeThickness="2"

我的应用程序运行和渲染正确,但在加载窗口时,我注意到调试输出中有许多错误。Itemscontrol中的每个项都有相同的3个错误,总计为100

Itemscontrol数据模板有一个Path对象,该对象的DataContext绑定到一个属性,该属性通过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>
我理解错误的含义,因为它正在查找的属性不存在于Alarm上,它们存在于它正确解析和呈现的匿名类型上

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

以下是错误:

(摘要) BindingExpression路径错误:在对象报警上找不到“填充”、“笔划”、“数据”属性

(实际) System.Windows.Data错误:40:BindingExpression路径错误:在“对象”“报警”(HashCode=37465686)上未找到“填充”属性。BindingExpression:Path=Fill;DataItem='Alarm'(HashCode=37465686);目标元素为“路径”(名称=“”);目标属性为“填充”(类型为“笔刷”)

System.Windows.Data错误:40:BindingExpression路径错误:“在对象”“报警”(HashCode=37465686)“上找不到Stroke”属性。BindingExpression:路径=笔划;DataItem='Alarm'(HashCode=37465686);目标元素为“路径”(名称=“”);目标属性为“笔划”(类型为“笔刷”)

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

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

 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;
    }

有很多资源都在谈论绑定错误会降低应用程序性能


参见第7条-

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


本例中的另一种方法是创建一组样式,而不是作为静态资源,然后绑定Path对象的Style属性。请参见

减速只会在调试模式下发生,在发布模式下,由于errors@thumbmunkeys这些是我需要关注的实际错误吗?有没有给他们贴上惊喜标签?我只是在准备向构建经理解释它们的可能性。问题是,如果可以避免不会出现任何错误,为什么
报警
对象在任何时候都是
DataContext
。@H.B.我想可能是从DataTemplate声明中得到的。但即使在我取出数据类型属性之后,消息仍然是相同的。@jrandomuser:
DataType
只有在不设置
x:Key
(然后使用基于类型的隐式应用程序)时才起作用。顺便说一句,您可以对这三个属性绑定使用属性表示法(例如,
Data=“{Binding Data}”
),而且:使用
IsAsync
是毫无意义的,因为只要转换器代码返回,所有三个属性都可以立即访问。但这只是控制输出中出现问题的级别。我知道它们是什么,只是不知道它们是什么,也不知道如何解决它们。为什么要使用匿名,为什么不将“Value”属性绑定到每个Path.Data、Path.Fill和Path.Stroke,每个都有自己的转换器。就我个人而言,我会尝试同时删除转换器的使用。我在这里进行了翻译,因为ViewModel本身没有任何形状或颜色等概念。ViewModel所知道的只是它有一个状态为X的警报。我可以将很多警报移到ViewModel,但大部分视图是由状态:如果我在VM上创建了可绑定属性,我将有几十个。我必须为边框颜色、背景颜色、关联的故事板、字体重量、文本颜色、父边框颜色等制作一个。我不是建议将这些属性放在VM上,我是建议为您希望“转换”属性值的每种方式设置一个转换器。我以前有过这样的想法,我想最好将应用于单个元素的元素组合在一起。我可能得把他们弄回来。我开始认为需要完全信任才能正确绑定匿名类型是一个问题,但在最近的一次测试之后,我认为这与匿名类型没有任何关系。我正在用我的发现更新这个问题。
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;
    }