diff --git a/src/Controls/src/Core/HandlerImpl/Picker/Picker.Impl.cs b/src/Controls/src/Core/HandlerImpl/Picker/Picker.Impl.cs index 2b9cd72f7598..cd4d0189dc59 100644 --- a/src/Controls/src/Core/HandlerImpl/Picker/Picker.Impl.cs +++ b/src/Controls/src/Core/HandlerImpl/Picker/Picker.Impl.cs @@ -26,7 +26,7 @@ string GetItem(int index) if (index < Items?.Count) { var item = Items[index]; - return item == null ? string.Empty : item; + return item ?? string.Empty; } return string.Empty; diff --git a/src/Controls/src/Core/Picker.cs b/src/Controls/src/Core/Picker.cs index 90992ca70da9..2600767993fc 100644 --- a/src/Controls/src/Core/Picker.cs +++ b/src/Controls/src/Core/Picker.cs @@ -318,6 +318,7 @@ void ResetItems() ((LockableObservableListWrapper)Items).InternalClear(); foreach (object item in ItemsSource) ((LockableObservableListWrapper)Items).InternalAdd(GetDisplayMember(item)); + Handler?.UpdateValue(nameof(IPicker.Items)); UpdateSelectedItem(SelectedIndex); } diff --git a/src/Core/tests/DeviceTests/Handlers/Picker/PickerHandlerTests.Windows.cs b/src/Core/tests/DeviceTests/Handlers/Picker/PickerHandlerTests.Windows.cs index 433f4c540827..eb2f581939d4 100644 --- a/src/Core/tests/DeviceTests/Handlers/Picker/PickerHandlerTests.Windows.cs +++ b/src/Core/tests/DeviceTests/Handlers/Picker/PickerHandlerTests.Windows.cs @@ -1,9 +1,49 @@ -using Microsoft.UI.Xaml.Controls; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Maui.DeviceTests.Stubs; +using Microsoft.UI.Xaml.Controls; +using Xunit; namespace Microsoft.Maui.DeviceTests { public partial class PickerHandlerTests { + [Fact(DisplayName = "ItemsSource Updates Correctly")] + public async Task ItemsSourceUpdatesCorrectly() + { + int selectedIndex = 0; + + var oldItems = new List + { + "Old Item 1", + "Old Item 2", + "Old Item 3" + }; + + var newItems = new List + { + "New Item 1", + "New Item 2", + "New Item 3" + }; + + var picker = new PickerStub() + { + Title = "Select an Item", + ItemsSource = oldItems, + SelectedIndex = 1 + }; + + picker.ItemsSource = newItems; + picker.SelectedIndex = selectedIndex; + + string expected = picker.ItemsSource[selectedIndex].ToString(); + var actual = await GetValueAsync(picker, handler => GetNativeText(handler)); + + Assert.Equal(expected, actual); + } + + ComboBox GetNativePicker(PickerHandler pickerHandler) => pickerHandler.PlatformView; @@ -12,5 +52,12 @@ UI.Xaml.HorizontalAlignment GetNativeHorizontalTextAlignment(PickerHandler picke UI.Xaml.VerticalAlignment GetNativeVerticalTextAlignment(PickerHandler pickerHandler) => GetNativePicker(pickerHandler).VerticalAlignment; + + string GetNativeText(PickerHandler pickerHandler) + { + var comboBox = GetNativePicker(pickerHandler); + + return comboBox.Items[comboBox.SelectedIndex].ToString(); + } } } \ No newline at end of file diff --git a/src/Core/tests/DeviceTests/Stubs/PickerStub.cs b/src/Core/tests/DeviceTests/Stubs/PickerStub.cs index 2b23b81fde8b..7758b24462b9 100644 --- a/src/Core/tests/DeviceTests/Stubs/PickerStub.cs +++ b/src/Core/tests/DeviceTests/Stubs/PickerStub.cs @@ -1,4 +1,5 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; using Microsoft.Maui.Graphics; @@ -12,7 +13,24 @@ public partial class PickerStub : StubBase, IPicker public IList Items { get; set; } = new List(); - public IList ItemsSource { get; set; } + IList _itemsSource; + + public IList ItemsSource + { + get => _itemsSource; + set => SetProperty(ref _itemsSource, value, onChanged: OnItemsSourceChanged); + } + + void OnItemsSourceChanged(IList oldValue, IList newValue) + { + if (ItemsSource == null) + return; + + Items.Clear(); + + foreach (object item in ItemsSource) + Items.Add(item.ToString()); + } public int SelectedIndex { get; set; } = -1;