diff --git a/TileView.qml b/TileView.qml
index 27eae29719bd965564e1c51f357a23e05d307341..767752b9a473a676c681d43f69aa82be167ec9f0 100644
--- a/TileView.qml
+++ b/TileView.qml
@@ -12,15 +12,13 @@ Control {
     property real handleWidth: 5
     property real handleHeight: 5
 
-    property var _majorPositions: {
-        let positions = [];
-        for (let i = 0; i < majorCount; ++i) {
-            positions.push(i / majorCount);
-        }
-        return positions;
-    }
-    property var _minorPositions: {
-        let count = Math.max(...minorCounts);
+    property var _majorPositions: _makeDefaultPositionsArray(majorCount)
+    property var _minorPositions: _makeDefaultPositionsArray(Math.max(...minorCounts))
+
+    property alias model: contentRepeater.model
+    property Component delegate
+
+    function _makeDefaultPositionsArray(count) {
         let positions = [];
         for (let i = 0; i < count; ++i) {
             positions.push(i / count);
@@ -28,8 +26,19 @@ Control {
         return positions;
     }
 
-    property alias model: contentRepeater.model
-    property Component delegate
+    Component.onCompleted: {
+        // break binding
+        _majorPositions = _majorPositions;
+        _minorPositions = _minorPositions;
+    }
+
+    onMajorCountChanged: {
+        _majorPositions = _makeDefaultPositionsArray(majorCount);
+    }
+
+    onMinorCountsChanged: {
+        _minorPositions = _makeDefaultPositionsArray(Math.max(...minorCounts));
+    }
 
     contentItem: Item {
         Item {