Привязка WinJS к объектам WinRT

Мы пишем приложение для Магазина Windows. Большая часть обработки и агрегирования данных выполняется в компоненте WinRT, а пользовательский интерфейс написан на WinJS/HTML. Одна из основных проблем, с которыми мы сталкиваемся, — это невозможность привязки WinJS к объектам WinRT. В частности, среда выполнения WinJS создает исключение, говорящее о том, что она не может расширять объект WinRT. Это строка кода, которая пытается определить новое свойство объекта данных. Это прекрасно работает для объектов WinJS, поскольку они являются динамическими. Не так для WinRT. Единственный способ, с помощью которого я могу выполнить привязку, — это привязка oneTime, потому что она не пытается создать объект Observable из объекта WinRT. Есть ли какой-то интерфейс, который объекты WinRT могут реализовать для поддержки односторонней или даже двусторонней привязки?


person Szymon Rozga    schedule 17.10.2012    source источник


Ответы (2)


Нет, это невозможно без создания собственной оболочки, которая либо:

  • «Прокси» для объекта WinRT и заставьте этот прокси прослушивать события от объекта WinRT и задайте свойства
  • Создайте нечто, выглядящее как наблюдаемое и спроецированное вверх из слоя WinRT (например, у него есть функция «привязки», которая принимает обратный вызов и т. д.
person Dominic Hopton    schedule 17.10.2012
comment
Вариант 2 звучит интересно. Есть ли какая-либо документация, которая говорит мне, как я могу этого добиться? Какие методы необходимо реализовать и т.д.? - person Szymon Rozga; 18.10.2012
comment
Не совсем, но я бы начал с открытия base.js и проверки публичного контракта ObservableMixin. Следите за _getObservable; это ключ к тому, чтобы остановить их, пытающихся обернуть вас. - person Dominic Hopton; 19.10.2012
comment
Выбранный ответ - это именно то, что я в итоге сделал, и вы можете увидеть мои различные приключения в написании хорошего прокси здесь: social.msdn.microsoft.com/Forums/en-US/winappswithhtml5/thread/ - person Adam Hewitt; 22.02.2013

Мне не нужно было беспокоиться о двусторонней привязке, но подобный код, описанный ниже, у меня сработал. Примечание. Не следуйте показанному соглашению об именах методов 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 (которые также содержат их значения).

person metaomniliquant    schedule 09.05.2013