У меня проблема с DataBindings
в C # WinForms при использовании tab
для переключения между элементами управления.Я создал пример приложения WinForms, чтобы показать проблему.Вот код:
PersonModel person { get; set; } = new PersonModel();
private void frmMain_Load(object sender, EventArgs e)
{
//Create test person, populate with values
person = new PersonModel { FirstName = "Sammy", LastName = "Smith", UserType = "Admin", Age = 29, Gender = "Female", EducationYears = 4};
CreateBindings();
}
private void CreateBindings()
{
txtFirstName.DataBindings.Add("Text", person, "FirstName");
txtLastName.DataBindings.Add("Text", person, "LastName");
cmbUserType.DataBindings.Add("Text", person, "UserType", false, DataSourceUpdateMode.OnPropertyChanged);
cmbGender.DataBindings.Add("Text", person, "Gender", false, DataSourceUpdateMode.OnPropertyChanged);
nudAge.DataBindings.Add("Value", person, "Age", true, DataSourceUpdateMode.OnPropertyChanged);
nudEducationYears.DataBindings.Add("Value", person, "EducationYears", true, DataSourceUpdateMode.OnPropertyChanged);
}
private void btnSave_Click(object sender, EventArgs e)
{
MessageBox.Show(person.ToString());
}
class PersonModel
{
public string FirstName { get; set; } = "";
public string LastName { get; set; } = "";
public string UserType { get; set; } = "Read-only";
public string Gender { get; set; } = "Unspecified";
public int Age { get; set; } = 0;
public int EducationYears { get; set; } = 0;
public override string ToString()
{
string message = "";
message += $"First name: {this.FirstName}{Environment.NewLine}";
message += $"Last name: {this.LastName}{Environment.NewLine}";
message += $"User type: {this.UserType}{Environment.NewLine}";
message += $"Gender: {this.Gender}{Environment.NewLine}";
message += $"Age: {this.Age.ToString()}{Environment.NewLine}";
message +=$"Education (years): {this.EducationYears.ToString()}";
return message;
}
}
Пользовательский интерфейс - это всего лишь несколько элементов управления TextBoxes, ComboBoxes и NumericUpDown, которые связаны с PersonModel
person
.Когда я щелкаю мышью по пользовательскому интерфейсу и изменяю значения в элементах управления, программа работает должным образом: когда я нажимаю Save
, метод ToString()
для PersonModel
показывает, что все свойства были обновлены в соответствии с ожиданиями.Тем не менее, когда я перезапускаю приложение и переключаюсь через элементы управления, привязка данных для комбинированных списков (для Gender
и User Type
) не обновляет значения в person
.Когда я переключаюсь до Save
и нажимаю Enter
, метод ToString()
показывает, что свойства Gender
и UserType
в person
не изменились.
При щелчке по интерфейсу всевходные значения правильно отображаются в person
:
![Clicking through controls](https://i.stack.imgur.com/28ycb.png)
При переходе через пользовательский интерфейс вводятся значения для Gender
и UserType
не применяются к соответствующим свойствам (обратите внимание, что значения по умолчанию Admin
и Female
остаются без изменений):
![Tabbing through controls](https://i.stack.imgur.com/3wyZC.png)
В чем проблемаВот?Почему привязки данных работают так, как ожидалось, при переходе по пользовательскому интерфейсу, а при переходе по ним - нет?Мне нужно выбрать другой PropertyName
для комбинированных списков в привязке данных?Если Text
не подходит PropertyName
для использования в привязке данных, почему Text
работает без проблем при нажатии на элементы управления?
РЕДАКТИРОВАТЬ: Комментарий от LarsTech решил мою проблему, но костальной части сообщества, я все еще хотел бы услышать какие-либо мысли о том, почему использование tab
для навигации по моей форме не обновляет привязки данных при нажатии на форму.Я знаю, что события фокусировки отличаются при использовании вкладки в отличие от нажатия .Однако, поскольку все те же события все еще происходят, я не знаю, объяснит ли это разницу.