diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj
index cc8cdd942..a699a8792 100644
--- a/CrossPlatformModules.csproj
+++ b/CrossPlatformModules.csproj
@@ -147,6 +147,7 @@
+
@@ -898,6 +899,7 @@
+
diff --git a/apps/tests/ui/bindable-tests.ts b/apps/tests/ui/bindable-tests.ts
index 85c617145..fcefcf755 100644
--- a/apps/tests/ui/bindable-tests.ts
+++ b/apps/tests/ui/bindable-tests.ts
@@ -14,6 +14,9 @@ import labelModule = require("ui/label");
import textFieldModule = require("ui/text-field");
import fs = require("file-system");
import appModule = require("application");
+import repeaterModule = require("ui/repeater");
+import gestureModule = require("ui/gestures");
+import layoutBaseModule = require("ui/layouts/layout-base");
//
// For information and examples how to use bindings please refer to special [**Data binding**](../../../../bindings.md) topic.
@@ -528,6 +531,30 @@ export var test_BindingContext_NavigatingForwardAndBack = function () {
helper.navigateToModuleAndRunTest(("." + moduleName + "/bindingContext_testPage1"), null, testFunc);
}
+export var test_RepeaterItemsGestureBindings = function () {
+ var testFunc = function (page: pageModule.Page) {
+ var repeater = (page.getViewById("repeater"));
+ var hasObservers = false;
+ var eachChildCallback = function (childItem: viewModule.View) {
+ if (childItem instanceof labelModule.Label) {
+ var gestureObservers = childItem.getGestureObservers(gestureModule.GestureTypes.tap);
+ hasObservers = gestureObservers ? gestureObservers.length > 0 : false;
+ }
+ else if (childItem instanceof layoutBaseModule.LayoutBase) {
+ childItem._eachChildView(eachChildCallback);
+ }
+ return true;
+ }
+
+ repeater._eachChildView(eachChildCallback);
+
+ TKUnit.assertEqual(hasObservers, true, "Every item should have tap observer!");
+ }
+
+ var moduleName = __dirname.substr(fs.knownFolders.currentApp().path.length);
+ helper.navigateToModuleAndRunTest(("." + moduleName + "/repeaterItems-bindingToGestures"), null, testFunc);
+}
+
export var test_BindingToSource_FailsAfterBindingContextChange = function () {
var createLabel = function () {
var label = new labelModule.Label();
diff --git a/apps/tests/ui/repeaterItems-bindingToGestures.ts b/apps/tests/ui/repeaterItems-bindingToGestures.ts
new file mode 100644
index 000000000..61f1cf3aa
--- /dev/null
+++ b/apps/tests/ui/repeaterItems-bindingToGestures.ts
@@ -0,0 +1,14 @@
+function pageLoaded(args) {
+ var page = args.object;
+ page.bindingContext = {
+ items: [
+ { text: "1", tapItem: function () { console.log("1") } },
+ { text: "2", tapItem: function () { console.log("2") } }
+ ]
+ };
+}
+exports.pageLoaded = pageLoaded;
+
+exports.tapPage = function (args) {
+ console.log("Tap! " + args + " " + args.object);
+}
\ No newline at end of file
diff --git a/apps/tests/ui/repeaterItems-bindingToGestures.xml b/apps/tests/ui/repeaterItems-bindingToGestures.xml
new file mode 100644
index 000000000..12b04ea7e
--- /dev/null
+++ b/apps/tests/ui/repeaterItems-bindingToGestures.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ui/repeater/repeater.ts b/ui/repeater/repeater.ts
index bd9c18ede..02849944c 100644
--- a/ui/repeater/repeater.ts
+++ b/ui/repeater/repeater.ts
@@ -149,8 +149,8 @@ export class Repeater extends viewModule.CustomLayoutView implements definition.
for (i = 0; i < this.items.length; i++) {
var viewToAdd = !types.isNullOrUndefined(this.itemTemplate) ? builder.parse(this.itemTemplate, this) : this._getDefaultItemContent(i);
if (!types.isNullOrUndefined(viewToAdd)) {
- this.itemsLayout.addChild(viewToAdd);
viewToAdd.bindingContext = this._getDataItem(i);
+ this.itemsLayout.addChild(viewToAdd);
}
}
}