Uwp Autosuggestbox OrderBy Displaymemberpath

#c# #xaml #uwp #sql-order-by #textchanged

#c# #xaml #uwp #sql-порядок по #текст изменен

Вопрос:

У меня есть поведение для моего autosuggestbox, в котором я должен упорядочить все предлагаемые элементы списка в порядке возрастания, и это поведение будет применяться к 1 общему стилю AutoSuggestBox во всем приложении. Когда я пытаюсь упорядочить просто с помощью самого объекта, он работает нормально, поскольку элементы представляют собой просто список строк. Но когда элементы представляют собой список объектов, и я хочу отсортировать их по 1 определенному свойству, то у меня это не работает. Я использую DisplayMemberPath, чтобы указать ему, какое свойство он должен искать. Ниже приведен код, с которым я пытался :

Поведение

 public class AutoSuggestSortBehavior : IBehavior
{
    public void Attach(DependencyObject associatedObject) => ((AutoSuggestBox) associatedObject).TextChanged  = AutoSuggestSortBehavior_TextChanged;

    private void AutoSuggestSortBehavior_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
    {
        var autoSuggestBox = sender;
        if(autoSuggestBox?.Items?.Count > 0 amp;amp; args.Reason == AutoSuggestionBoxTextChangeReason.UserInput amp;amp; !string.IsNullOrWhiteSpace(sender.Text))
        {
            if (!string.IsNullOrWhiteSpace(autoSuggestBox.DisplayMemberPath))
            {
                autoSuggestBox.ItemsSource = autoSuggestBox.Items.ToList().OrderBy(x => x.GetType().GetProperty(autoSuggestBox.DisplayMemberPath).Name).ToList();
            }
            else
            {
                autoSuggestBox.ItemsSource = autoSuggestBox.Items.ToList().OrderBy(x => x).ToList();
            }
        }            
    }
    public void Detach(DependencyObject associatedObject) => ((AutoSuggestBox) associatedObject).TextChanged -= AutoSuggestSortBehavior_TextChanged;
}
  

Xaml

 <AutoSuggestBox
    Header="AutoSuggest"
    QueryIcon="Find"
    Text="With text, header and icon"
    TextChanged="AutoSuggestBox_TextChanged" />
<AutoSuggestBox
    DisplayMemberPath="Name"
    Header="AutoSuggest2"
    QueryIcon="Find"
    Text="With text, header and icon"
    TextChanged="AutoSuggestBox_TextChanged2" />
  

События с изменением текста

 private void AutoSuggestBox_TextChanged(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
    {
        var abcc = new List<string>();
        abcc.Add("xyz");
        abcc.Add("321");
        abcc.Add("123");
        abcc.Add("lopmjk");
        abcc.Add("acb");
        sender.ItemsSource = abcc;
    }

    private void AutoSuggestBox_TextChanged2(AutoSuggestBox sender, AutoSuggestBoxTextChangedEventArgs args)
    {
        var persons = new List<Person>();
        persons.Add(new Person { Name = "xyz", count = 1 });
        persons.Add(new Person { Name = "321", count = 2 });
        persons.Add(new Person { Name = "123", count = 3 });
        persons.Add(new Person { Name = "lopmjk", count = 4 });
        persons.Add(new Person { Name = "acb", count = 5 });
        sender.ItemsSource = persons;
    }
  

Ответ №1:

Итак, я нашел решение с помощью небольшого эксперимента, мы можем использовать метод GetValue() с передачей самого объекта, а затем он работает, как ожидалось :

 autoSuggestBox.ItemsSource = autoSuggestBox.Items.ToList().OrderBy(x => x.GetType().GetProperty(autoSuggestBox.DisplayMemberPath).GetValue(x)).ToList();