编译绑定的时间检查?

nas*_*kew 5 silverlight wpf xaml binding mvvm

我是MVVM的新手,我理解MVVM的一些好处,而不是xaml背后的简单代码(例如VM的可测试性).我们正在使用Caliburn Micro来执行某些绑定,但这有点无关紧要,我可以使用特定的绑定{绑定...},我的问题或多或少会保持不变.

我理解VM如果一切都正确完成就不应该知道V的逻辑,但似乎因为我们在V和VM之间使用动态运行时绑定,编译器无法检查每个绑定的合法性表达.例如,如果我有一个名为UserName的UI组件,然后将卡利尝试绑定,要叫用户名在运行时VM性能(类似于做这样的事情的价值="{绑定用户名}").但是,如果我重命名我的VM属性或拼错UI组件名称或绑定表达式,我们在运行时之前没有任何问题的迹象.

在我看来,能够告诉xaml UI组件或页面将被绑定到特定接口将是非常好的,这样编译器就可以完成一些必须完成的工作(由测试部门(这是我经常).

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

Chu*_*Tey 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);
Run Code Online (Sandbox Code Playgroud)