代码之家  ›  专栏  ›  技术社区  ›  Fyodor Soikin

绑定的静态验证

  •  11
  • Fyodor Soikin  · 技术社区  · 14 年前

    如何确保所有绑定保持正确?
    (这有点长,但请容忍我,我尽量缩短)

        <TextBox Name="tb" />
        <TextBlock Text="{Binding Text.TheProp, ElementName=tb}" />
    

    在编译时,绑定是不正确的(也就是说,解析器知道元素的类型) tb 因此,它知道它的类型 Text 因此,它知道 TheProp 不存在)。

    这种行为在某些情况下可能非常有用:不管我的数据是什么类型的,只要它有适当的命名属性,我都可以。因此,我们得到了一种“声明性duck类型”。

    然而 ,鸭子打字并不总是一件好事。
    具体来说,在使用MVVM模式时,我知道(大多数时候)所有ViewModel对象的确切类型。另一方面,随着时间的推移,模型变得越来越复杂,这让我担心将来的重构:如果我决定重命名一些属性,或者,上帝不允许,将它们放在一个单独的聚合对象中呢?那我所有的绑定会怎么样?我需要手动清理所有XAML文件吗?即使没有重构-如果我只是打了个错字怎么办?

    Style/Setter/@Property ,则会出现编译时错误。
    TemplateBinding

    所以,理想情况下,我希望看到这样的情况:

        public class ProductViewModel
        {
            public Name { get; set; }
            public Price { get; set; }
        }
    

    产品视图.XAML:

        <UserControl x:Class="Shopping.View.ProductView"
                     x:DataContextType="vm:ProductViewModel"
                     xmlns:vm="clr-namespace:Shopping.ViewModel"
                     ... >
            <TextBox Text="{Binding Name}" />  <!-- OK -->
            <TextBox Text="{Binding Price}" /> <!-- OK -->
            <TextBox Text="{Binding ABC}" />   <!-- Compile time error: there is no property ABC in ProductViewModel -->
        </UserControl>
    

    购物车.XAML:

        <UserControl x:Class="Shopping.View.ShoppingCartView"
                     x:DataContextType="vm:ShoppingCartViewModel"
                     xmlns:vm="clr-namespace:Shopping.ViewModel"
                     ... >
            <ItemsControl ItemsSource="{Binding Products}"
                          ItemType="vm:ProductViewModel" >  <!-- Static check happens here 
                                                                 ShoppingCartViewModel.Products must 
                                                                 implement IEnumerable<ProductViewModel> -->
                <ItemsControl.ItemTemplate>
                    <DataTemplate DataType="vm:ProductViewModel">
                        <view:ProductView /> <!-- DataContext is known to be of correct type
                                                  because of DataTemplate.DataType property -->
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </UserControl>
    

    然而,我肯定我不是第一个有这个问题的人。
    最后,问题是: 如何确保绑定正确?他们就这样呆着?

    2 回复  |  直到 14 年前
        1
  •  8
  •   Samuel Jack    13 年前

    作为.NET4的一部分,微软发布了一个新的 System.Xaml 库提供独立于WPF的健壮的Xaml解析和序列化支持。他们现在开始在上面构建各种有趣的东西,其中一些可能会对你有所帮助。

    XamlToolkit ,例如,您将发现 XamlDOM 这使您能够对Xaml文件进行简单的静态分析。再进一步说,还有 FxCop rules for XAML

    最感兴趣的是罗布·雷耶的 BindingFinder 它的明确目标是在Xaml中检查绑定类型。这需要在Xaml中有类型提示,比如 DataType d:DataContext attribute 在视图上(Blend用于提供设计时数据)。然后使用XamlDOM检查所有内容是否匹配。

    Resharper 6 现在提供 intellisense for data bindings ,并在属性路径错误时发出警告。

        2
  •  2
  •   Community ahmed    13 年前

    实际上,我从未发现这是个问题,至少在使用MVVM模式时是这样。视图模型仅支持视图。我不会改变一个而不改变另一个。重构视图模型不会破坏视图中的绑定,因为重构视图模型本身是没有意义的。您只会在更改视图的设计时重构视图模型。

    与MVVM一样,在你明白自己在做什么和为什么之前,这样做是一件令人难以置信的麻烦事。( This long blog post Jonas Folles对如何使用 Ninject

    感觉