#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. БОЖЕ, СПАСИБО ТАК МНОГО