xaml绑定中的灾难性故障
我正在开发Windows 10 Universal App。 我的代码如下:
XAML:
和代码背后:
namespace MyProject { public sealed partial class BlankPage1 : Page { public BlankPage1() { DataContext = new[] { new { X = 50.0, Y = 100.0 }, new { X = 220.0, Y = 170.0 } }; InitializeComponent(); } } }
不幸的是,矩形没有显示在窗口中。 我收到编译错误:
Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
分配给Canvas坐标xaml中的静态数字按预期工作。
为什么会出错并且代码不起作用?
在构建通用Windows平台应用程序时,我自己偶然发现了这个问题。
做了一些谷歌搜索,发现这篇文章。
这非常有帮助。 我将他的SetterValueBindingHelper
类复制到我自己的项目中。 在那之后,我进行了1次调整,因为
type = System.Type.GetType(item.Type).GetTypeInfo();
在XAML绑定中执行Type="Canvas"
时出现exception。 它首先尝试在当前程序集中找到Canvas
类。 这返回null
,然后调用.GetTypeInfo()
抛出NullReferenceException。
在其上实现了C#6.0的新Null-Conditional Operator
,并解决了这个问题。 在检查type
是否为null之后立即执行代码,然后遍历所有已加载的程序集以查找Canvas
。
type = System.Type.GetType(item.Type)?.GetTypeInfo();
他的第二个用法示例奇怪地与将其与Canvas
元素一起使用有关。
我的Project VisualDesigner的另一个例子:
这是我的最终XAML,基于他的例子:
helpers:
指的是SetterValueBindingHelper
所在的命名空间。在我的例子中, ApplicationWindow
是一个自定义UserControl。 CanvasItems
是一个ObservableCollection
,这是我的ApplicationWindowViewModel
:
[ImplementPropertyChanged] public class ApplicationWindowViewModel : ViewModelBase { public string Title { get; set; } public double WindowX { get; set; } = 10; public double WindowY { get; set; } = 10; public int WindowWidth { get; set; } = 300; public int WindowHeight { get; set; } = 200; }
在这个例子中,我使用Fody.PropertyChanged处理X / Y / Width / Height属性上的属性更改事件,如果您不使用此包,请不要忘记实现自己的PropertyChanged事件处理程序等。