6

我对 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

4 回答 4

4

虽然编译器不支持 XAML 的编译时检查,但您可以通过编写自定义构建任务来实现大致相同的结果,该任务通过XAMLReader类实例化每个 XAML 文件,然后使用自定义 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);
于 2012-09-10T11:32:53.767 回答
2

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

Wpf Binding Path={x:Static <propertypath>} 的性能影响?

于 2012-11-06T15:29:46.437 回答
0

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

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

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

于 2015-06-27T23:55:23.600 回答
-1

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

于 2012-09-10T10:53:37.607 回答