Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 绑定的编译时检查?_Wpf_Silverlight_Xaml_Mvvm_Binding - Fatal编程技术网

Wpf 绑定的编译时检查?

Wpf 绑定的编译时检查?,wpf,silverlight,xaml,mvvm,binding,Wpf,Silverlight,Xaml,Mvvm,Binding,我是MVVM的新手,我了解MVVM相对于xaml背后的简单代码的一些好处(例如VM的可测试性)。我们使用Caliburn Micro来执行一些绑定,但这有点不相关,我可以使用特定绑定{binding…},我的问题或多或少会保持不变 我理解这样一种逻辑:如果一切都做得正确,VM应该对V一无所知,但似乎因为我们在V和VM之间使用动态运行时绑定,编译器无法检查每个绑定表达式的合法性。例如,如果我有一个名为UserName的UI组件,那么Caliburn将在运行时尝试将其绑定到名为UserName的VM

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

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

虽然编译器不支持XAML的编译时检查,但通过编写一个自定义生成任务,通过类实例化每个XAML文件,然后使用侦听器侦听绑定错误,您可能会获得大致相同的结果

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

Binding createBinding(表达式属性,对象源)
{
MemberExpression me=property.Body作为MemberExpression;
if(me==null | | me.Expression!=property.Parameters[0]
||me.Member.MemberType!=MemberTypes.Property){
抛出新的InvalidOperationException(
“现在告诉我有关财产的情况”);
}
绑定b=新绑定(me.Member.Name);
b、 来源=来源;
返回b;
}
//示例代码
Binding b=createBinding(()=>this.FontSize,this);
textBlock1.SetBinding(TextBlock.FontSizeProperty,b);

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

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

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


有关完整说明,请参见第页的解决方案8

啊哈。。。这是另一种选择,不是。OP已经知道这一点,不想使用它。
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);