Редактирование атрибутов элементов WPF Combobox, привязанных к настраиваемому списку объектов - PullRequest
0 голосов
/ 25 мая 2020

У меня возникли проблемы с созданием функциональности для поля со списком wpf, привязанного к списку настраиваемых объектов в классе, который не находится в той же области, что и Mainwindow.

Вот класс настраиваемых объектов Я разработал для хранения списка серверов с основными c деталями. Это то, что сериализуется и десериализуется для сохранения информации между сеансами приложения:

namespace ServerCollection
{
    [Serializable]
    class ServerConfiguration 
    {
        private ObservableCollection<ServerItem> _servers;
        public ObservableCollection<ServerItem> Servers
        {
            get { return _servers; }
            set
            {
                _servers = value;
            }
        }

        [JsonConstructor]
        public ServerConfiguration()
        {
            Servers = new ObservableCollection<ServerItem>();
        }

    }

    [Serializable]
    class ServerItem : INotifyPropertyChanged
    {
        private string _serverName;
        public string ServerName
        {
            get { return _serverName; }
            set 
            { 
                _serverName = value;
                NotifyPropertyChanged(ServerName);
            }
        }

        private string _url;
        public string URL
        {
            get { return _url; }
            set { _url = value; }
        }

        private string _username;
        public string Username
        {
            get { return _username; }
            set { _username = value; }
        }

        private string _password;
        public string Password
        {
            get { return _password; }
            set { _password = value; }
        }

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public ServerItem()
        {

        }

        [JsonConstructor]
        public ServerItem(string server_name, string server_url, string server_username, string server_password)
        {
            ServerName = server_name;
            URL = server_url;
            Username = server_username;
            Password = server_password;
        }
    }
}

Чего я хочу достичь: я хочу привязать список «Серверы» к полю со списком в окне wpf и иметь возможность добавлять новые элементы сервера (работает нормально), удалять элементы сервера (работает нормально) и иметь возможность редактировать детали существующего элемента сервера (здесь возникают проблемы).

в настоящее время, вот как я привязка cobmbobox к списку серверов из кода программной части:

private void BindDropdownToServersList()
        {
            servers_dropdown.SelectedIndex = 0;
            servers_dropdown.DataContext = configuration;
            servers_dropdown.ItemsSource = configuration.Servers;
            servers_dropdown.DisplayMemberPath = "ServerName";

        }

Функция обработки процедуры редактирования (нажатие на фиксацию после редактирования записей текстового поля в окне) выглядит следующим образом:

private void OK_button_Click(object sender, RoutedEventArgs e)
        {
            switch (mode)
            {
                case (ServerInfoMode.Default):
                    {

                    }
                    break;
                case (ServerInfoMode.Adding):
                    {
                        if (!string.IsNullOrEmpty(URL_textBox.Text) && !string.IsNullOrEmpty(Username_textBox.Text) && !string.IsNullOrEmpty(Password_Box.Password) && !string.IsNullOrEmpty(ServerName_textbox.Text))
                        {
                            ServerItem si = new ServerItem(ServerName_textbox.Text, URL_textBox.Text, Username_textBox.Text, Password_Box.Password);

                            configuration.Servers.Add(si);

                            servers_dropdown.SelectedItem = si;

                            mode = ServerInfoMode.Default;
                            HandleServerInfoMode();
                        }
                        else
                        {
                            MessageBox.Show("Please fill all the server details", "check your entry!", MessageBoxButton.OK, MessageBoxImage.Warning);
                        }


                    }
                    break;
                case (ServerInfoMode.Editing):
                    {
                        if (!string.IsNullOrEmpty(URL_textBox.Text) && !string.IsNullOrEmpty(Username_textBox.Text) && !string.IsNullOrEmpty(Password_Box.Password) && !string.IsNullOrEmpty(ServerName_textbox.Text))
                        {

                            ServerItem item = configuration.Servers.Where(i => i == servers_dropdown.SelectedItem).First();

                            item.ServerName = ServerName_textbox.Text;
                            item.URL = URL_textBox.Text;
                            item.Username = Username_textBox.Text;
                            item.Password = Password_Box.Password;

                            servers_dropdown.SelectedItem = item;

                            mode = ServerInfoMode.Default;
                            HandleServerInfoMode();
                        }
                        else
                        {
                            MessageBox.Show("Please fill all the server details", "check your entry!", MessageBoxButton.OK, MessageBoxImage.Warning);
                        }

                    }
                    break;
                case (ServerInfoMode.Deleting):
                    {

                    }
                    break;
            }
        }

Проблема, с которой я сталкиваюсь: когда я редактирую имя сервера и фиксирую, элементы в раскрывающемся списке поля со списком обновляются, но текст, отображаемый в поле со списком (текущее выбранное значение), остается старым значением, даже после вызова ComboBox.Items.Refre sh (); метод.

As seen, the new server name enteed in the textbox reflects in the dropdown list, but the value of the selected item is still the old value (

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

Заранее благодарим вас за любую помощь по этому вопросу! Ура!

1 Ответ

1 голос
/ 25 мая 2020

попробуйте NotifyPropertyChanged(nameof(ServerName)); или NotifyPropertyChanged("ServerName"); вместо NotifyPropertyChanged(ServerName);

PropertyChanged событие обязательное имя свойства. Если имя свойства неверно, привязка в представлении не обновляет связанное значение.

«элементы в раскрывающемся списке поля со списком обновляются» - они, вероятно, перестраиваются каждый раз, когда раскрывающийся список открывается, поэтому они имеют последнее значение.

...