Ken*_*ith 28 data-binding wpf xaml
我最大的烦恼之一就是数据绑定如何与XAML一起使用,因为没有强力键入数据绑定的选项.换句话说,在C#中,如果你想访问一个不存在的对象的属性,你将无法获得Intellisense的任何帮助,如果你坚持忽略Intellisense,编译器会抱怨你并赢得'让你继续 - 我怀疑这里的很多人会同意这是一件非常好的事情.但是在XAML数据绑定中,您无需网络即可运行.你可以绑定任何东西,即使它不存在.实际上,考虑到XAML数据绑定的奇怪语法,并且根据我自己的经验,绑定到存在的东西比不存在的东西更复杂.我更有可能让我的数据绑定语法错误而不是正确; 而我花在排除XAML数据绑定上的比较时间很容易使我花在微软堆栈的任何其他部分上的时间相形见绌(包括尴尬和恼人的WCF,如果你能相信的话).其中大部分(并非全部)都回到了这样一个事实,即如果没有强类型数据绑定,我无法从Intellisense或编译器获得任何帮助.
所以我想知道的是:为什么不MS至少给我们一个选项有强类型数据绑定:有点像如何VB6,我们可以做任何反对的变体,如果我们真的自虐,但大部分使用普通的类型变量是有意义的.MS有什么理由不能这样做吗?
这是我的意思的一个例子.在C#中,如果属性"UsrID"不存在,您将从Intellisense收到警告,如果您尝试此操作,则会收到编译器的错误:
string userID = myUser.UsrID;
Run Code Online (Sandbox Code Playgroud)
但是,在XAML中,您可以执行以下所有操作:
<TextBlock Text="{Binding UsrID}" />
Run Code Online (Sandbox Code Playgroud)
Intellisense,编译器或(最令人惊讶的)应用程序本身在运行时都不会给你任何暗示你做错了什么.现在,这是一个简单的例子,但是处理复杂对象图和复杂UI的任何实际应用程序都会有大量等效的场景,这些场景根本不简单,也不容易排除故障.即使您第一次使它正常工作,如果您重构代码并更改C#属性名称,那么您就是SOL.所有东西都会编译,并且它会在没有错误的情况下运行,但是没有任何东西可以工作,让你在整个应用程序中搜寻和啄食,试图弄清楚什么是坏的.
一个可能的建议(在我的头顶,我没有想过)可能是这样的:
对于逻辑树的任何部分,您可以在XAML中指定它期望的对象的DataType,如下所示:
<Grid x:Name="personGrid" BindingDataType="{x:Type collections:ObservableCollection x:TypeArgument={data:Person}}">
Run Code Online (Sandbox Code Playgroud)
这可能会在.g.cs文件中生成一个强类型的ObservableCollection <Person> TypedDataContext属性.所以在你的代码中:
// This would work
personGrid.TypedDataContext = new ObservableCollection<Person>();
// This would trigger a design-time and compile-time error
personGrid.TypedDataContext = new ObservableCollection<Order>();
Run Code Online (Sandbox Code Playgroud)
然后,如果您通过网格上的控件访问了TypedDataContext,它将知道您尝试访问的对象类型.
<!-- It knows that individual items resolve to a data:Person -->
<ListBox ItemsSource="{TypedBinding}">
<ListBox.ItemTemplate>
<DataTemplate>
<!--This would work -->
<TextBlock Text="{TypedBinding Path=Address.City}" />
<!-- This would trigger a design-time warning and compile-time error, since it has the path wrong -->
<TextBlock Text="{TypedBinding Path=Person.Address.City} />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
我在这里发了一篇博客,解释了我对WPF/XAML数据绑定的挫败感,以及我认为更好的方法.有什么理由不起作用吗?有没有人知道MS是否打算解决这个问题(按照我的建议,或者希望更好)?
Cha*_*lie 10
在Visual Studio 2010中将有智能感知支持数据绑定.这似乎是您的投诉真正归结为,因为数据绑定是强类型的.你只是在运行时才发现绑定是否成功,而且往往是安静地失败而不是嘈杂的异常.当绑定失败时,WPF会通过调试跟踪转储解释性文本,您可以在Visual Studio输出窗口中看到它.
除了缺乏智能感知支持和一些奇怪的语法问题,数据绑定也做得很好(至少在我看来).有关调试数据绑定的更多帮助,我会在这里查看Bea的可爱文章.
这是我对XAML最大的抱怨!没有编译器强制执行有效的数据绑定是一个大问题.我并不关心intellisense,但我关心缺乏重构支持.
在WPF应用程序中更改属性名称或类型是危险的 - 使用内置的重构支持不会更新XAML中的数据绑定.对名称进行搜索和替换是危险的,因为它可能会更改您不打算更改的代码.通过查找结果列表是一个痛苦的屁股和耗时.
MVC在一段时间内已经有了强类型视图 - MVC contrib项目为MVC1提供了它们,MVC2为它们本身提供了它们.XAML将来必须支持这一点,特别是如果它用于应用程序设计随着时间的推移而发展的"敏捷"项目中.我没有看过.NET 4.0/VS2010,但我希望它的体验远比它好!
小智 6
我觉得xaml就像旧日的HTML一样.我无法想象,经过10年多的时间,我正在以这种方式进行编程:手动键入open-close标签,因为我无法使用成熟的GUi来定义样式和绑定以及模板.肯,我强烈支持你的观点.我觉得非常奇怪为什么有这么多人支持MVVM而没有一个抱怨调试xaml的痛苦.命令绑定和数据绑定是非常好的概念,我一直在设计我的winform应用程序.但是,xaml绑定解决方案与其他一些xaml问题(或缺乏复杂功能)在VS中确实是一个很大的失败.它使开发和调试非常困难,并使代码非常难以理解.
小智 5
Ken,C#将从用于引用PropertyInfo类的简洁语法元素中受益。PropertyInfo结构是在编译时定义的静态对象,因此为对象上的每个Property提供了唯一的键。然后可以在编译时验证属性。
唯一的问题是,鉴于强类型是对类型而不是类型的值强制执行的,因此将对象的实例视为数据类型很奇怪。传统上,编译器不强制执行数据值,而是依靠运行时代码来检查其数据。大多数情况下甚至不可能在编译时验证数据,但是反射是至少有可能的那些极端情况之一。
另外,编译器可以为每个属性创建一个新的数据类型。我可以想象会创建许多类型,但这将使属性绑定的编译时强制实施。
一种思考的方法是,CLR引入了一个反射级别,与之前的系统相比,它的反射级别更高。现在,它被用于做一些令人印象深刻的工作,例如数据绑定。但是其实现仍处于元数据级别,编译器会针对每种数据类型生成一种报告。我以为增长C#的一种方法是提升元数据来编译时间检查。
在我看来,有人可以开发一种编译工具来添加反射级别验证。新的智能感知就是这样。一般地发现要与PropertyInfos比较的字符串参数将很棘手,但这并非没有可能。可以定义一个新的数据类型,例如“ PropertyString”,以明确标识将来将与PropertyInfos比较的参数。
无论如何,我感到你很痛苦。我追逐了很多拼写错误的属性名称引用。老实说,WPF中有很多与反射有关的烦恼。WPF强制检查器将是一个有用的实用程序,它可以确保所有静态控件构造函数都就位,正确定义了属性,绑定正确,键正确等。可以执行的验证清单很长。
如果我仍在为Microsoft工作,我可能会尝试这样做。
归档时间: |
|
查看次数: |
4828 次 |
最近记录: |