【问题标题】:Detect broken bindings in XAML already at compile time已在编译时检测 XAML 中损坏的绑定
【发布时间】:2017-08-29 16:47:44
【问题描述】:

我认为这是一个简单而常见的场景 - 您在 XAML 中将依赖属性绑定到 viewmodel 中的属性,然后在 viewmodel 中重命名该属性而忘记在 XAML 中重命名它。绑定也坏了。

有没有办法在编译时检测到这种损坏的绑定?

【问题讨论】:

  • 对于 UWA,Microsoft 引入了 x:Bind,不幸的是它是可编译的绑定,因为 WPF 绑定仍然基于反射。我会看看是否有办法在 WPF/ 中使用 x:Bind
  • 如果在设计时设置了视图 DataContext,设计器会为不正确的绑定路径显示下划线。所以设计时 DataContext 是一种保险。

标签: wpf xaml mvvm data-binding


【解决方案1】:

您可以将 VM 类添加到您的 Binding 行:

<DataGrid ItemsSource="{Binding Path=(viewModels:MyViewModel.MyItemsSource)}" />

与:

namespace ViewModels{
    public class MyViewModel{
        public ICollectionView MyItemsSource {get; set;}
    }
}

这显示了设计时的 BindingErrors

【讨论】:

  • 太棒了,编译时出现错误,如果我使用它,但绑定在运行时不起作用。我得到 System.ArgumentNullException; “密钥不能为空”。我将 Text TextBox 绑定到 VM 中的字符串属性。
  • @Rekshino:我认为这个错误是在DesignTime 生成的(当它被构建时)。普通的编译器不会产生这个错误(正如我在 build -> output [errors: 0] 中看到的那样)。我不知道如何告诉您的编译器生成此错误。但是有了这个,你就有机会看到你的绑定会在哪里失败。我认为RuntimeException 的结果是由TwoWay BindingMode 引起的。
  • 不,在编译时一切正常,它可以正常工作(没有错误,如果属性名称正确,否则错误)! ,但是如果我编译它没有错误,则在运行时会出现错误。 OneWay 绑定也是如此。只有 OneWayToSource 不会出错,但这种模式很少见。
  • @Rekshino:你有没有用一些文本初始化你的有界属性?喜欢:public string MyText{get{return _myText;}set{_myText = value; OnPropertyChanged();}}private string _myText = "";
  • 是的,已初始化。如果没有 (namespace:VMClassName.),绑定也可以正常工作。
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 2010-12-25
  • 2011-09-28
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多