wpf - 编译时检查绑定(bind)?

标签 wpf silverlight xaml mvvm binding

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

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

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

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

最佳答案

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

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

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

关于wpf - 编译时检查绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12350109/

相关文章:

javascript - 带有 JavaScript 的 silverlight

wpf - 如何设置实时图表的标签颜色?

c# - Xamarin Forms XAML - 创建没有 UI 的自定义控件?

c# - 如何在 Blend 4 中编辑使用 VS2012 创建的 c# 项目?

wpf - 在 View 模型中验证 DateTime 属性

使用 OpenXML 将 WPF Canvas 转换为 Word 文档

c# - 检测 VisualTree 或 LogicalTree 中的父级是否已在 WPF 控件中更改

c# - WPF 数据虚拟化和 DataGrid

javascript - 当 Silverlight 调用 JavaScript window.alert/prompt 时 Windows Safari 卡住

wpf - 你可以在 VisualStateManager 中为 TemplatedParent 设置 ZIndex 动画吗?