【问题标题】:Compile time checking of bindings?编译时检查绑定?
【发布时间】:2012-09-10 10:48:37
【问题描述】:

我对 MVVM 比较陌生,我了解 MVVM 相对于 xaml 背后的简单代码的一些好处(例如 VM 的可测试性)。我们正在使用 Caliburn Micro 来执行一些绑定,但这有点无关紧要,我可以使用特定绑定 {binding ...} 我的问题或多或少会保持不变。

我理解如果一切都正确完成,VM 应该不知道 V 的逻辑,但似乎因为我们在 V 和 VM 之间使用动态运行时绑定,编译器无法检查合法性每个绑定表达式。例如,如果我有一个名为 UserName 的 UI 组件,则 Caliburn 将尝试在运行时将其绑定到名为 UserName 的 VM 属性(类似于执行 Value="{binding UserName}" 之类的操作)。但是,如果我重命名我的 VM 属性或拼错 UI 组件名称或绑定表达式,在运行时之前我们不会得到任何问题的指示。

在我看来,能够告诉 xaml 一个 UI 组件或页面将绑定到一个特定的界面,这样编译器就可以完成一些原本必须要做的工作,这真是太好了。由测试部门完成(和重做)(我经常这样做)。

有没有办法告诉 xaml 我们正在绑定到接口或对象类型?是否有一些工具可以插入 xaml 应用程序以验证绑定?

【问题讨论】:

    标签: wpf silverlight xaml mvvm binding


    【解决方案1】:

    虽然编译器不支持 XAML 的编译时检查,但您可以通过编写自定义构建任务来实现大致相同的结果,该任务通过 XAMLReader 类实例化每个 XAML 文件,然后使用 custom TraceListener监听绑定错误。

    除此之外,如果您准备使用代码进行数据绑定,则可以创建直接引用属性名的绑定。类似于以下内容(未经测试)

    Binding createBinding<TProperty>(Expression<Func<TProperty>> property, object source)
    {
        MemberExpression me = property.Body as MemberExpression;
        if (me == null || me.Expression != property.Parameters[0]
              || me.Member.MemberType != MemberTypes.Property) {
            throw new InvalidOperationException(
                "Now tell me about the property");
        }
        Binding b = new Binding(me.Member.Name);
        b.Source = source;
    
        return b;
    }
    
    // sample code
    Binding b = createBinding(()=>this.FontSize, this);
    textBlock1.SetBinding(TextBlock.FontSizeProperty, b);
    

    【讨论】:

      【解决方案2】:

      这篇文章给出了一个简洁的例子,说明如何消除绑定中的魔法字符串。它不会进行编译时类型检查,但至少编译器会发现拼写错误。

      Performance impact of Wpf Binding Path={x:Static <propertypath>}?

      【讨论】:

        【解决方案3】:

        您问“是否有一些工具可以插入 xaml 应用程序以验证绑定?”。

        是的,您可以使用Snoop 在运行时检测错误绑定。它不是编译时间 - 但它同样有效。

        有关完整说明,请参阅Solution 8ReSharper WPF error: "Cannot resolve symbol "MyVariable" due to unknown DataContext"

        【讨论】:

          【解决方案4】:

          您可以通过在运行时在输出窗口中查找绑定错误来轻松检查是否有任何绑定失败。您可能需要设置调试信息以绑定到详细。

          【讨论】:

          • 啊哈...这是另一种选择
          • 不是。 OP 已经知道这一点并且不想使用它。
          猜你喜欢
          • 2019-06-18
          • 2017-12-04
          • 1970-01-01
          • 2017-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-03
          • 2017-06-26
          相关资源
          最近更新 更多