Не удается очистить список, пока выбран элемент

#c# #wpf #listbox

#c# #wpf #поле со списком

Вопрос:

Здравствуйте, сегодня я экспериментировал с WPF и обнаружил, что, когда в списке есть выбранный элемент, он не позволяет изменять его и зависает приложение

         private void Button_Click_7(object sender, RoutedEventArgs e)
    {
        ScriptBox.Items.Clear();
        Functions.PopulateListBox(ScriptBox, "./Scripts", "*.txt");
        Functions.PopulateListBox(ScriptBox, "./Scripts", "*.lua");
    }
 

Я новичок в WPF, поэтому было бы очень полезно выяснить, почему это происходит.

Редактировать: Может быть Mscorelib.dll (Это не так)

Редактировать: Попытка улова Сработала с улучшениями Перегрина

Комментарии:

1. Пожалуйста, не забудьте прочитать описания тегов перед их использованием, чтобы не злоупотреблять ими. Ваш вопрос не касается приложения Visual Studio, поэтому [visual-studio] тег не имеет отношения к делу.

Ответ №1:

Даже если вы не собираетесь использовать полный маршрут MVVM, все равно неплохо отделить данные вашего приложения от элементов управления пользовательского интерфейса.

1] В конструкторе вашего окна создайте ObservableCollection<string> и установите его в качестве ItemsSource элемента ScriptBox управления.

 private ObservableCollection<string> _scriptBoxCollection;

public MyView()
{
    _scriptBoxCollection = new ObservableCollection<string>();
    ScriptBox.ItemsSource = _scriptBoxCollection ;
}       
 

2] Измените свой PopulateListBox() метод, чтобы просто возвращать коллекцию имен файлов. Следуя принципу единой ответственности, такие методы не должны заботиться о том, как используются данные, которые они генерируют.

 public ReadOnlyCollection<string> GetMatchingFiles(string folder, string fileSpec) { ... }
 

Возвращаемое значение ReadOnlyCollection<T> соответствует рекомендациям Microsoft.

3] Измените обработчик нажатия кнопки, чтобы он обновлял наблюдаемую коллекцию.

 private void Button_Click_7(object sender, RoutedEventArgs e)
{
    _scriptBoxCollectionClear();

    foreach(var item in Functions.GetMatchingFiles("./Scripts", "*.txt")
        _scriptBoxCollection.Add(item);

    Functions.GetMatchingFiles("./Scripts", "*.lua")
        _scriptBoxCollection.Add(item);
}
 

ForEach Конструкция требуется, поскольку стандарт ObservableCollection не поддерживает AddRange() .


Добавьте это в Functions.cs (и удалите PopulateListBox() и любые другие подобные методы, которые записывают данные непосредственно в элементы управления пользовательского интерфейса)

 public static ReadOnlyCollection<string> GetMatchingFiles(string folder, string fileType) 
{
    var result = new List<string>();
    var dinfo = new DirectoryInfo(folder); 
    var files = dinfo.GetFiles(fileType); 
    foreach (var file in files) 
    { 
        result.Add(file.Name); 
    } 
    
    return result.AsReadOnly();
}
 

Комментарии:

1. Спасибо, просто я не настолько хорош в Wpf, чтобы понять это, но это помогло мне

2. Подождите, это может быть проблемой с MScorlib.dll

3. Я использую этот Тог

4. Oof в funtions.cs public static аннулирует PopulateListBox(system. Windows. Элементы управления. ListBox lsb, строковая папка, строковый тип файла) { DirectoryInfo dinfo = новый DirectoryInfo(папка); FileInfo[] Files = dinfo.GetFiles(тип файла); foreach (файл FileInfo в файлах) { lsb. Товары. Добавить(file.Name ); } } не позволит мне использовать это, вероятно, так, как это было закодировано

5. @Pak Это похоже на код winforms 20-летней давности, а не на современный WPF. Я добавил пример кода выше, показывающий, как я буду генерировать и использовать список подходящих файлов.

Ответ №2:

Вы пробовали использовать ScriptBox.UnselectAll() или ScriptBox.SelectedIndex = -1 ?

Предполагая, что ScriptBox — это ваш список.

Комментарии:

1. БОЖЕ, СПАСИБО ТАК МНОГО