diff --git a/src/MaterialDesignThemes.Wpf/AutoSuggestBox.cs b/src/MaterialDesignThemes.Wpf/AutoSuggestBox.cs index 11214da0f9..71d028d35e 100644 --- a/src/MaterialDesignThemes.Wpf/AutoSuggestBox.cs +++ b/src/MaterialDesignThemes.Wpf/AutoSuggestBox.cs @@ -96,7 +96,11 @@ public object SelectedItem set => SetValue(SelectedItemProperty, value); } public static readonly DependencyProperty SelectedItemProperty = - DependencyProperty.Register(nameof(SelectedItem), typeof(object), typeof(AutoSuggestBox), new PropertyMetadata(default(object))); + DependencyProperty.Register( + nameof(SelectedItem), + typeof(object), + typeof(AutoSuggestBox), + new FrameworkPropertyMetadata(default(object), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public object SelectedValue @@ -254,6 +258,7 @@ private bool CommitValueSelection(object? selectedValue) { CaretIndex = Text.Length; } + SetCurrentValue(SelectedItemProperty, selectedValue); CloseAutoSuggestionPopUp(); var args = new RoutedPropertyChangedEventArgs(oldValue, Text) { diff --git a/tests/MaterialDesignThemes.UITests/Samples/AutoSuggestBoxes/AutoSuggestTextBoxWithCollectionView.xaml b/tests/MaterialDesignThemes.UITests/Samples/AutoSuggestBoxes/AutoSuggestTextBoxWithCollectionView.xaml index cba573ebb8..12076ca6d9 100644 --- a/tests/MaterialDesignThemes.UITests/Samples/AutoSuggestBoxes/AutoSuggestTextBoxWithCollectionView.xaml +++ b/tests/MaterialDesignThemes.UITests/Samples/AutoSuggestBoxes/AutoSuggestTextBoxWithCollectionView.xaml @@ -14,7 +14,9 @@ materialDesign:HintAssist.HelperText="Name" materialDesign:TextFieldAssist.HasClearButton="True" Text="{Binding AutoSuggestText, UpdateSourceTrigger=PropertyChanged}" - Suggestions="{Binding Suggestions}"> + Suggestions="{Binding Suggestions}" + SelectedItem="{Binding SelectedItem}" + > BaseSuggestions { get; } [ObservableProperty] - private ObservableCollection _suggestions = new(); + private ObservableCollection _suggestions = []; [ObservableProperty] private string? _autoSuggestText; @@ -41,14 +41,14 @@ partial void OnAutoSuggestTextChanged(string? oldValue, string? newValue) public AutoSuggestTextBoxWithTemplateViewModel() { - BaseSuggestions = new() - { + BaseSuggestions = + [ new("Apples"), new("Bananas"), new("Beans"), new("Mtn Dew"), new("Orange"), - }; + ]; Suggestions = new ObservableCollection(BaseSuggestions); } @@ -62,9 +62,7 @@ private static bool IsMatch(string item, string currentText) } } -public class SuggestionThing +public class SuggestionThing(string name) { - public string Name { get; } - - public SuggestionThing(string name) => Name = name; + public string Name { get; } = name; } diff --git a/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs b/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs index 5d4c7494c6..59e2fc3f75 100644 --- a/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs +++ b/tests/MaterialDesignThemes.UITests/WPF/AutoSuggestBoxes/AutoSuggestTextBoxTests.cs @@ -1,4 +1,3 @@ -using System.Collections; using System.ComponentModel; using MaterialDesignThemes.UITests.Samples.AutoSuggestBoxes; using MaterialDesignThemes.UITests.Samples.AutoSuggestTextBoxes; @@ -201,6 +200,38 @@ public async Task AutoSuggestBox_KeysUpAndDown_WrapAround() Assert.Equal(0, await suggestionListBox.GetSelectedIndex()); } + [Fact] + [Description("Issue 3845")] + public async Task AutoSuggestBox_SelectingAnItem_SetsSelectedItem() + { + await using var recorder = new TestRecorder(App); + + //Arrange + IVisualElement userControl = await LoadUserControl(); + IVisualElement suggestBox = await userControl.GetElement(); + IVisualElement popup = await suggestBox.GetElement(); + IVisualElement suggestionListBox = await popup.GetElement(); + + //Act + await suggestBox.MoveKeyboardFocus(); + await Task.Delay(50); + await suggestBox.SendKeyboardInput($"B{Key.Down}{Key.Enter}"); + await Task.Delay(50); + + //Assert + string? selectedItem = (await suggestBox.GetSelectedItem()) as string; + Assert.Equal("Bananas", selectedItem); + + static void AssertViewModelProperty(AutoSuggestBox autoSuggestBox) + { + var viewModel = (AutoSuggestTextBoxWithCollectionViewViewModel)autoSuggestBox.DataContext; + Assert.Equal("Bananas", viewModel.SelectedItem); + } + await suggestBox.RemoteExecute(AssertViewModelProperty); + + recorder.Success(); + } + private static async Task AssertExists(IVisualElement suggestionListBox, string text, bool existsOrNotCheck = true) { try