C# 在XAML中绑定整数不会导致错误

C# 在XAML中绑定整数不会导致错误,c#,wpf,xaml,C#,Wpf,Xaml,我是WPF/XAML的新手。如果绑定到XAML中的错误数据类型,我希望得到一条错误消息。XAML似乎希望所有绑定都是通过字符串进行的,但如果您错误地使用int或double,则不会出现错误消息 我发现这个XAML代码: 如果我绑定到int属性X或string属性Xstr,它就可以正常工作。如果我尝试使用公共字段X,那么绑定似乎找不到类成员(即使它是公共的)。因此,当绑定失败时,行为与代码中的异常不同。输出窗口中会出现如下错误,但应用程序不会停止: System.Windows.Data Erro

我是WPF/XAML的新手。如果绑定到XAML中的错误数据类型,我希望得到一条错误消息。XAML似乎希望所有绑定都是通过字符串进行的,但如果您错误地使用int或double,则不会出现错误消息

我发现这个XAML代码:

如果我绑定到int属性X或string属性Xstr,它就可以正常工作。如果我尝试使用公共字段X,那么绑定似乎找不到类成员(即使它是公共的)。因此,当绑定失败时,行为与代码中的异常不同。输出窗口中会出现如下错误,但应用程序不会停止:

System.Windows.Data Error: 40 : BindingExpression path error: '_X' property not found on 'object' ''Point' (HashCode=7877106)'. BindingExpression:Path=_X; DataItem='Point' (HashCode=7877106); target element is 'ContentPresenter' (Name=''); target property is 'Left' (type 'Double')
似乎XAML希望所有绑定都是通过字符串进行的

那不是真的。您可以绑定所需的任何数据类型,只要您尝试绑定到的属性和您尝试绑定的属性来自同一类型,或者共享某个基类型

如果不是,WPF绑定机制将提供一种称为的功能,允许您将绑定类型转换为绑定属性所期望的类型

默认情况下,WPF绑定机制将对您尝试绑定的任何属性调用
ToString()
方法。在您的例子中,对int调用
ToString()
方法将返回所需的结果,因此没有问题

但是,如果使用引用类型,默认情况下,
ToString()
将返回类型的名称,而不是预期的值,这将导致意外行为

您无法捕获这些类型的“错误”。 你可以:

  • 在运行时在VisualStudio输出窗口中查看它们,如注释部分所述
  • System.Windows.Data错误:5:BindingExpression生成的值对目标属性无效

  • 注意你正在装订的东西
  • 在绑定中看到意外行为时,查找类型不匹配
  • 欢迎来到xaml的魔力:)

    似乎XAML希望所有绑定都是通过字符串进行的

    那不是真的。您可以绑定所需的任何数据类型,只要您尝试绑定到的属性和您尝试绑定的属性来自同一类型,或者共享某个基类型

    如果不是,WPF绑定机制将提供一种称为的功能,允许您将绑定类型转换为绑定属性所期望的类型

    默认情况下,WPF绑定机制将对您尝试绑定的任何属性调用
    ToString()
    方法。在您的例子中,对int调用
    ToString()
    方法将返回所需的结果,因此没有问题

    但是,如果使用引用类型,默认情况下,
    ToString()
    将返回类型的名称,而不是预期的值,这将导致意外行为

    您无法捕获这些类型的“错误”。 你可以:

  • 在运行时在VisualStudio输出窗口中查看它们,如注释部分所述
  • System.Windows.Data错误:5:BindingExpression生成的值对目标属性无效

  • 注意你正在装订的东西
  • 在绑定中看到意外行为时,查找类型不匹配

  • 欢迎使用xaml的魔力:)

    首先使用X和Y作为整数,而不是实际工作的字符串


    否则,如果将项目设置为debug而不是realease,则大多数绑定错误将打印在控制台输出中。

    首先使用X和Y作为整数,而不是实际工作的字符串


    否则,如果将项目设置为debug而不是realease,大多数绑定错误将在控制台输出中打印。

    数据绑定可以使用任何数据类型。绑定系统在每个项上调用“ToString”或内置转换器,以获取XAML的表示形式。(您可以通过编写自己的转换器来解决这个问题,这是一个XAML主题。)

    其他人是正确的,当绑定出现问题时.NET不会抛出错误。这是,微软的员工们告诉我的,他们是有意的。他们称之为“优雅地失败”

    但是获得错误信息反馈是可能的。要从绑定系统获得更好的错误消息,请在Visual Studio中找到“工具”、“选项”菜单项。然后,转到“调试”部分并选择“输出窗口”属性类别

    其中一个条目是一个名为“WPF跟踪设置”的组。将“数据绑定”选项更改为“警告”,您将获得有关所有失败绑定的调试窗口反馈


    数据绑定可以使用任何数据类型。绑定系统在每个项上调用“ToString”或内置转换器,以获取XAML的表示形式。(您可以通过编写自己的转换器来解决这个问题,这是一个XAML主题。)

    其他人是正确的,当绑定出现问题时.NET不会抛出错误。这是,微软的员工们告诉我的,他们是有意的。他们称之为“优雅地失败”

    但是获得错误信息反馈是可能的。要从绑定系统获得更好的错误消息,请在Visual Studio中找到“工具”、“选项”菜单项。然后,转到“调试”部分并选择“输出窗口”属性类别

    其中一个条目是一个名为“WPF跟踪设置”的组。将“数据绑定”选项更改为“警告”,您将获得有关所有失败绑定的调试窗口反馈


    不要忘记提及Visual Studio输出窗口中出现的这些绑定错误。不要忘记提及Visual Studio输出窗口中出现的这些绑定错误。从家中重建示例时,我可以使X和Y作为整数工作。为了澄清,整数属性可以工作,但整数字段不能。在我原来的帖子中看到更新。你可以在这里看到为什么它在属性上工作而不是字段的答案:这里是
    class Point
    {
        public int _X; //I know this is usually private, this is to demonstrate
        public int _Y; //the issue with binding to a public field
        public string Xstr
        {
            get { return _X.ToString(); }
        }
        public string Ystr
        {
            get { return _Y.ToString(); }
        }
        public int X
        {
            get { return _X; }
            private set { _X = value; }
        }
        public int Y
        {
            get { return _Y; }
            private set { _Y = value; }
        }
    
        public Point(int x, int y)
        {
            _X = x;
            _Y = y;
        }
    } 
    
    System.Windows.Data Error: 40 : BindingExpression path error: '_X' property not found on 'object' ''Point' (HashCode=7877106)'. BindingExpression:Path=_X; DataItem='Point' (HashCode=7877106); target element is 'ContentPresenter' (Name=''); target property is 'Left' (type 'Double')