Пытаюсь разобраться с 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;
}
Вы используете Binding к массиву строку "ListResult", а не к его содержимому, т.е. привязка сработает при изменении ссылки на "string[] ListResult", а не ListResult[1] или сортировки содержимого.
Как вариант, можно использовать индексатор (стоит учесть это при реализации сортировки в методе lg.sorted()):
public string this[int index]
{
get
{
return ListResult[index];
}
set
{
ListResult[index] = value;
OnPropertyChanged("ListResult");
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Используется код для выборки всех колонок в таблице и дальнейшее применение к каждой функционала updateПри этом он на колонки типа integer как...
Класс CalculationResult<T> использует инкапсуляцию, чтобы задать контракт:
Как по нажатию на кнопку в новом pdf вывести дату и содержимое файла filepdf с кирилической записью? Нашел варианты которые работают по отдельности,...