Обработка ComboBox в MVVM

210
07 января 2022, 18:40

Есть ComboBox который содержит коллекцию List<string> Folders которая состоит из путей к папкам, а так же содержит строку "Добавить папку". Что бы хотелось? Когда пользователь выбирает "Добавить папку" то открывался бы диалог выбора папки, выбранная папка добалялась бы в коллекцию Folders и ComboBox отображал бы не "Добавить папку", а соответственно выбранную папку. В принципе главное у меня работает, но ComboBox продолжает отображать "Добавить папку" и при выборе не обновляет у себя ComboBoxItemы. Я понятное дело делаю что-то не так, и прошу подсказать как надо.

Вот код XAML (лишнее я поубирал):

<ComboBox ItemsSource="{Binding Folders}" SelectedItem="{Binding Directory}"/>

VeiwModel

private List<string> folders;
public List<string> Folders 
{
     get => folders; 
     set 
     {
           folders = value;
           OnPropertyChanged("Folders"); 
     }
}
private string directory;
public string Directory
{
    get { return directory; }
    set
    {
        directory = value;
        if (directory == "Добавить папку")
        {
            directory = chooseFolder(); //Диалог выбора папки
            Folders.Insert(0, Directory);
        }
        // тут кое что будет
        OnPropertyChanged("Directory");
    }
}

Как я уже сказал в ComboBox стоит выбранная строка "Добавить папку" и варианты выбора не обновляются (хотя логика програмы дальше работает нормально, именно с той папкой которую выбрали)

Я сначала подумал, что нужно обновить ссылку на List<string> Folders что бы всё заработало (да я только учусь, потому не пинайте сильно) и дописал такой код: (на месте комментария // тут кое что будет)

List<string> temp = new List<string>();
temp.AddRange(Folders);
Folders = temp;

И тут мой мозг не выдержал :( В итоге имеем: если выбрать строку "Добавить папку", то прга зацикливается и происходит бесконечный вызов диалога выбора папки. Почему так происходит? Обновляю список, а вызов метода происходит будто я обновляю поле string Directory ?? И самое главное: как же всё таки правильно прописать?

Answer 1

Я нашёл решение на свой вопрос. К сожалению это скорее всего убогий костыль, но работает как задумывалось. А как правильно пока останется загадкой :(. Тем не менее, переписал часть кода и всё заработало как надо.

    public string Directory
        {
            get { return directory; }
            set
            {
                directory = value;
                if (directory == "Добавить папку" && ch == true)
                {
                    ch = false;
                    directory = chooseFolder(); //Диалог выбора папки
                    Folders.Insert(0, directory);
                    List<string> temp = new List<string>(folders);
                    Folders = temp;
                    Directory = Folders[0];
                }
                OnPropertyChanged("Directory");
                ch = true;
            }
        }
READ ALSO
Не запускается приложение после клика по кнопке [закрыт]

Не запускается приложение после клика по кнопке [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

96
Quartz.NET в трехуровневой архитектуре. С#

Quartz.NET в трехуровневой архитектуре. С#

Есть класс, который унаследован от интерфейса IJobЭкемпляр этого класса у меня создается через реализацию интерфейс

93
Как сохранить картинку на сервере по ее URL?

Как сохранить картинку на сервере по ее URL?

Есть адрес картинки, например http://sitecom/images/image

170
Как обратиться к элементу созданному в echo?

Как обратиться к элементу созданному в echo?

У меня есть следующий код:

109