我最大的烦恼之一就是数据绑定如何与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 …Run Code Online (Sandbox Code Playgroud) 我对MVVM的看法很复杂.似乎我需要编写如此多的代码来获得最有效的补救措施.我想念事件(命令是如此痛苦),绑定一切导致调试噩梦,我错过了对视图的引用!
我只是想知道你对MVVM的感受与背后的普通旧代码.你更喜欢什么和/或你通常使用或推荐使用什么?
谢谢