编辑绑定到自定义对象列表的 WPF 组合框项的属性
Editing the attributes of WPF Combobox items that is bound to a custom object list
我在为 wpf 组合框构建功能时遇到问题,该组合框绑定到 class 中的自定义对象列表,该列表与 Mainwindow 不在同一范围内。
这是一个自定义对象 class 我设计用来存储具有基本详细信息的服务器列表。这是序列化和反序列化的东西,以保存应用程序会话之间的信息:
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;
}
}
}
我想达到的目标:
我想将 "Servers" 列表绑定到 wpf window 中的组合框,并能够添加新的服务器项目(工作正常)、删除服务器项目(工作正常)并能够编辑详细信息一个现有的服务器项目(这里有问题)。
目前,这就是我从代码隐藏中将 cobmbobox 绑定到服务器列表的方式:
private void BindDropdownToServersList()
{
servers_dropdown.SelectedIndex = 0;
servers_dropdown.DataContext = configuration;
servers_dropdown.ItemsSource = configuration.Servers;
servers_dropdown.DisplayMemberPath = "ServerName";
}
处理编辑过程(在window中编辑文本框条目后单击提交)的函数如下:
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.Refresh() 之后也是如此;方法。
如何正确地将服务器列表绑定到组合框,以便反映对服务器项目所做的更改并确保它们在组合框中正确更新?
提前感谢您在此问题上提供的任何帮助!
干杯!
尝试 NotifyPropertyChanged(nameof(ServerName));
或 NotifyPropertyChanged("ServerName");
而不是 NotifyPropertyChanged(ServerName);
PropertyChanged
活动需要 属性 名称。当 属性 名称不正确时,视图中的绑定不会更新关联值。
"the items in the dropdown list of the combobox are updated" - 每次打开下拉菜单时它们都可能重建,因此它们具有最新值。
我在为 wpf 组合框构建功能时遇到问题,该组合框绑定到 class 中的自定义对象列表,该列表与 Mainwindow 不在同一范围内。
这是一个自定义对象 class 我设计用来存储具有基本详细信息的服务器列表。这是序列化和反序列化的东西,以保存应用程序会话之间的信息:
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;
}
}
}
我想达到的目标: 我想将 "Servers" 列表绑定到 wpf window 中的组合框,并能够添加新的服务器项目(工作正常)、删除服务器项目(工作正常)并能够编辑详细信息一个现有的服务器项目(这里有问题)。
目前,这就是我从代码隐藏中将 cobmbobox 绑定到服务器列表的方式:
private void BindDropdownToServersList()
{
servers_dropdown.SelectedIndex = 0;
servers_dropdown.DataContext = configuration;
servers_dropdown.ItemsSource = configuration.Servers;
servers_dropdown.DisplayMemberPath = "ServerName";
}
处理编辑过程(在window中编辑文本框条目后单击提交)的函数如下:
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.Refresh() 之后也是如此;方法。
如何正确地将服务器列表绑定到组合框,以便反映对服务器项目所做的更改并确保它们在组合框中正确更新?
提前感谢您在此问题上提供的任何帮助! 干杯!
尝试 NotifyPropertyChanged(nameof(ServerName));
或 NotifyPropertyChanged("ServerName");
而不是 NotifyPropertyChanged(ServerName);
PropertyChanged
活动需要 属性 名称。当 属性 名称不正确时,视图中的绑定不会更新关联值。
"the items in the dropdown list of the combobox are updated" - 每次打开下拉菜单时它们都可能重建,因此它们具有最新值。