diff --git a/src/Controls/src/Core/Picker/Picker.cs b/src/Controls/src/Core/Picker/Picker.cs index 09f5f32201c5..1a4e895bfe22 100644 --- a/src/Controls/src/Core/Picker/Picker.cs +++ b/src/Controls/src/Core/Picker/Picker.cs @@ -232,8 +232,10 @@ string GetDisplayMember(object item) static object CoerceSelectedIndex(BindableObject bindable, object value) { - var picker = (Picker)bindable; - return picker.Items == null ? -1 : ((int)value).Clamp(-1, picker.Items.Count - 1); + var picker = (Picker)bindable; + if (picker.Items == null || !picker.Items.Any()) + return value; // Do not coerce if Items are not set yet + return ((int)value).Clamp(-1, picker.Items.Count - 1); } void OnItemDisplayBindingChanged(BindingBase oldValue, BindingBase newValue) diff --git a/src/Controls/src/Xaml/XamlNode.cs b/src/Controls/src/Xaml/XamlNode.cs index 03c643012257..38c0bf053593 100644 --- a/src/Controls/src/Xaml/XamlNode.cs +++ b/src/Controls/src/Xaml/XamlNode.cs @@ -172,6 +172,21 @@ public ElementNode(XmlType type, string namespaceURI, IXmlNamespaceResolver name public NameScopeRef NameScopeRef { get; set; } public override void Accept(IXamlNodeVisitor visitor, INode parentNode) + Dictionary deferredProperties = new Dictionary(); + + public void DeferProperty(XmlName propertyName, object value) + { + deferredProperties[propertyName] = value; + } + + public void ApplyDeferredProperties() + { + foreach (var kvp in deferredProperties) + { + Properties[kvp.Key] = (INode)kvp.Value; + } + deferredProperties.Clear(); + } { if (visitor.VisitingMode == TreeVisitingMode.TopDown && !SkipVisitNode(visitor, parentNode)) visitor.Visit(this, parentNode); @@ -210,6 +225,19 @@ public override INode Clone() { var clone = new ElementNode(XmlType, NamespaceURI, NamespaceResolver, LineNumber, LinePosition) { + if (!SkipChildren(visitor, this, parentNode)) + { + // Check if ItemsSource or Items is being set and apply deferred SelectedIndex if any + if (Properties.ContainsKey(XmlName.xItemsSource) || Properties.ContainsKey(XmlName.xItems)) + { + ApplyDeferredProperties(); + } + + foreach (var node in Properties.Values.ToArray()) + node.Accept(visitor, this); + foreach (var node in CollectionItems.ToArray()) + node.Accept(visitor, this); + } IgnorablePrefixes = IgnorablePrefixes }; foreach (var kvp in Properties)