编译绑定的时间检查?

时间:2012-09-10 10:48:38

标签: wpf silverlight xaml mvvm binding

我是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应用程序中以验证绑定?

4 个答案:

答案 0 :(得分:4)

虽然编译器不支持XAML的编译时检查,但是通过编写通过XAMLReader类实例化每个XAML文件的自定义构建任务,然后使用{,您可以获得相同的结果。 {3}}侦听绑定错误。

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

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);

答案 1 :(得分:2)

这篇文章给出了如何消除绑定中的魔术字符串的简明示例。它不会进行编译时类型检查,但至少编译器会捕获拼写错误。

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

答案 2 :(得分:0)

你问&#34;是否有一些工具可以插入xaml应用程序来验证绑定?&#34;。

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

如需完整说明,请参阅ReSharper WPF error: "Cannot resolve symbol "MyVariable" due to unknown DataContext"上的Solution 8

答案 3 :(得分:-1)

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