【问题标题】:Binding WinJS to WinRT objects将 WinJS 绑定到 WinRT 对象
【发布时间】:2013-06-24 21:03:10
【问题描述】:

我们正在编写一个 Windows 应用商店应用程序。许多数据处理和聚合是在 WinRT 组件中完成的,并且 UI 是用 WinJS/HTML 编写的。我们遇到的主要问题之一是 WinJS 无法绑定到 WinRT 对象。具体来说,WinJS 运行时会引发无法扩展 WinRT 对象的异常。这是在尝试在数据对象上定义新属性的代码行中。这适用于 WinJS 对象,因为它们是动态的。 WinRT 并非如此。我可以绑定的唯一方法是通过 oneTime 绑定,因为这不会尝试从 WinRT 对象创建 Observable 对象。 WinRT 对象是否可以实现某种接口来支持一种方式甚至两种方式的绑定?

【问题讨论】:

    标签: windows-8 windows-runtime winjs


    【解决方案1】:

    不,如果不创建自己的包装器,这是不可能的:

    • “代理”WinRT 对象,并使该代理侦听来自 WinRT 对象的事件并设置属性
    • 制作一个看起来类似于可观察对象并从 WinRT 层向上投射的东西(例如,它有一个接受回调等的“绑定”函数。

    【讨论】:

    • 选项 2 听起来很有趣。是否有任何文档告诉我如何实现这一目标?需要实现哪些方法等?
    • 不是真的——但打开 base.js,检查 ObservableMixin 公共合约将是我开始的地方。注意 _getObservable;这是阻止他们试图包裹你的关键。
    • 选择的答案正是我最终做的,你可以在这里看到我写一个好的代理的各种冒险:social.msdn.microsoft.com/Forums/en-US/winappswithhtml5/thread/…
    【解决方案2】:

    我不需要担心双向绑定,但下面描述的类似代码对我有用。注意:请不要遵循所示的 JS 方法命名约定。

    C#

    public sealed class Stock
    {
       //... other private/internal methods/members
       private String _symbol;
    
       public string Symbol
       {
           get
           {
               return this._symbol;
           }
       }
    }
    

    JS

    _makeBindable: function (obj) {
        var o = new Object();
        for (m in obj) {
            o[m] = obj[m];
        }
        return o;
    }
    
    var projectedStockObj = getStockObjFromWinRTComponent();
    var bindableStockObj = _makeBindable(projectedStockObj);
    // ... use bindableStockObj in binding scenario(s)
    

    此解决方案创建一个新对象并向其中添加 WinRT 成员(也包含它们的值)。

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2020-09-27
      • 2016-07-23
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多