0

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

我在这里找到了这个 XAML 代码:

<ItemsControl ItemsSource="{Binding Path=PointList}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <!--<TextBox Text="{Binding Path=Xstr, Mode=OneWay}" />-->
            <Rectangle Fill="Red" Width="25" Height="25" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Canvas.Top" Value="{Binding Path=Ystr}" />
            <Setter Property="Canvas.Left" Value="{Binding Path=Xstr}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

我使用了一个可观察的 PointList of Points(X,Y) 集合。我一开始犯了一个错误,就是对 X 和 Y 使用整数而不是字符串。这很难调试,因为尝试将 Canvas.Top 绑定到整数时没有错误消息。Visual Studio 中是否有能够捕获此类错误的设置?


更新

我发现绑定适用于 int 属性,但不适用于公共 int 字段。这是我创建的一个 Point 类来测试它:

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

如果我绑定到 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')
4

3 回答 3

3

似乎 XAML 希望所有绑定都通过字符串

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

如果不是,则 WPF 绑定机制提供了一种名为的东西Converters,可让您将有界类型转换为绑定属性所期望的类型。

默认情况下,WPF 绑定机制将ToString()在您尝试绑定的任何属性上调用该方法。在您的情况下,在 int 上调用ToString()方法会返回所需的结果,所以那里没有问题。

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

你无法捕捉到那些类型的“错误”。你可以 :

  1. 如评论部分所述,在运行时在 Visual Studio 输出窗口中查看它们。

System.Windows.Data 错误:5:BindingExpression 生成的值对目标属性无效

  1. 注意你绑定的是什么
  2. 当看到绑定中的意外行为时,查找类型不匹配。

欢迎来到 xaml 的魔力 :)

于 2013-09-18T20:51:50.917 回答
2

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

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

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

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

在此处输入图像描述

于 2013-09-19T01:23:15.247 回答
0

首先使用 X 和 Y 作为整数而不是字符串实际上可以工作。

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

于 2013-09-18T20:57:40.433 回答