Не обновляется ListBox

106
08 ноября 2021, 17:20

Пытаюсь разобраться с MVVM и написал небольшое приложение. До определённого момента всё было прекрасно, но потом мой мозг сломался :( Итак есть ListBox

<ListBox Grid.Column="0" Grid.Row="3" Grid.ColumnSpan ="2" Width="Auto" Height="Auto" ItemsSource="{Binding ListResult}" Style="{StaticResource ListBoxStyle}"/>

Есть соответствующее поле в VM:

private string[] listResult = { "Итоговый список" };
    public string[] ListResult
    {
        get => listResult;
        set
        {
            listResult = value;
            OnPropertyChanged("ListResult");
        }
    }

И есть несколько кнопок которые меняют содержимое ListResult и всё прекрастно отображается. Вот для примера:

public RelayCommand MainCommand => new RelayCommand(o =>
{
    if (!System.IO.Directory.Exists(Folder))
    {
        MessageBox.Show("Выберете папку со списком");
        return;
    }
    ListResult = lg.createList(Lvl);
});
public RelayCommand Level => new RelayCommand(o =>
{
    if (System.IO.Directory.Exists(Folder))
    {
        ListResult = lg.createList(Lvl);
    }
});
public RelayCommand FullList => new RelayCommand(o =>
{
    if (!System.IO.Directory.Exists(Folder))
    {
        MessageBox.Show("Выберете папку со списком");
        return;
    }
    ListResult = lg.fullList();                         // Тут всё в порядке
});

Но в одном месте всё ломается :( вот код:

public RelayCommand Sorted => new RelayCommand(o =>
    {    
        ListResult = lg.sorted(ListResult);  
    });

Тут я сортирую список и список сортируется (проверено) но во View ничего не меняется :( Почему?

Экспериментируя я нашёл очень убогий костыль. Если переписать код вот так:

public RelayCommand Sorted => new RelayCommand(o =>
{    
    string[] sortedList = lg.sorted(ListResult);
    ListResult = new string[] { "Раз", "Два" };
    ListResult = sortedList;
});

То всё прекрасно отображается. Как это работает???? Помогите пожалуйста.

Для понимания происходящего некторые указанные тут методы:

public string[] createList(bool lvl)
    {
        this.lvl = lvl;
        List<string> darklist = new List<string>();
        numberOfTracks = 0;
        list = new List<string>();
        darklist.Add("========================================");
        darklist.AddRange(makeList(inDir));
        if (darklist.Count == 1) darklist.Add(" Список пуст");
        darklist.Add("========================================");
        string[] result = darklist.ToArray();
        return result;
    }
internal string[] fullList()
    {
        list = new List<string>();
        numberOfTracks = 0;
        list.Add("========================================");
        string[] dir = Directory.GetFiles(inDir, "*.mp3", SearchOption.AllDirectories);
        int numberOfTr = 0;
        foreach (string file in dir)
        {
            numberOfTr++;
            list.Add("| " + numberOfTr.ToString("D4") + " | " + file.Substring(file.LastIndexOf('\\') + 1));
        }
        if (list.Count == 1) list.Add(" Список пуст");
        list.Add("========================================");
        string[] result = list.ToArray();
        return result;
    }
Answer 1

Вы используете Binding к массиву строку "ListResult", а не к его содержимому, т.е. привязка сработает при изменении ссылки на "string[] ListResult", а не ListResult[1] или сортировки содержимого.

Как вариант, можно использовать индексатор (стоит учесть это при реализации сортировки в методе lg.sorted()):

public string this[int index]
{
  get
  {
     return ListResult[index];
  }
  set
  {
     ListResult[index] = value;
     OnPropertyChanged("ListResult");
   }
}
READ ALSO
C sharp Access data type mismatch in criteria expression

C sharp Access data type mismatch in criteria expression

Используется код для выборки всех колонок в таблице и дальнейшее применение к каждой функционала updateПри этом он на колонки типа integer как...

162
Как создать ValueObject без инкапсуляции?

Как создать ValueObject без инкапсуляции?

Класс CalculationResult<T> использует инкапсуляцию, чтобы задать контракт:

122
Замена элемента массива, хранящегося в ячейке БД

Замена элемента массива, хранящегося в ячейке БД

У меня в в БД данные хранятся в виде

79
Как поверх pdf вывести надпись на кирилице? tfpdf, fpdi

Как поверх pdf вывести надпись на кирилице? tfpdf, fpdi

Как по нажатию на кнопку в новом pdf вывести дату и содержимое файла filepdf с кирилической записью? Нашел варианты которые работают по отдельности,...

136