C # WinForms DataBindings не работает при переходе между элементами управления - PullRequest
0 голосов
/ 12 декабря 2018

У меня проблема с 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

При переходе через пользовательский интерфейс вводятся значения для Gender и UserTypeне применяются к соответствующим свойствам (обратите внимание, что значения по умолчанию Admin и Female остаются без изменений):

Tabbing through controls

В чем проблемаВот?Почему привязки данных работают так, как ожидалось, при переходе по пользовательскому интерфейсу, а при переходе по ним - нет?Мне нужно выбрать другой PropertyName для комбинированных списков в привязке данных?Если Text не подходит PropertyName для использования в привязке данных, почему Text работает без проблем при нажатии на элементы управления?

РЕДАКТИРОВАТЬ: Комментарий от LarsTech решил мою проблему, но костальной части сообщества, я все еще хотел бы услышать какие-либо мысли о том, почему использование tab для навигации по моей форме не обновляет привязки данных при нажатии на форму.Я знаю, что события фокусировки отличаются при использовании вкладки в отличие от нажатия .Однако, поскольку все те же события все еще происходят, я не знаю, объяснит ли это разницу.

1 Ответ

0 голосов
/ 15 декабря 2018

Как упомянуто LarsTech в комментариях, изменение DataBinding Property с Text на SelectedItem заставляет форму работать должным образом.При навигации по форме с использованием tab, DataBinding обновляет привязанное свойство так же, как если бы я щелкал по форме.

Я до сих пор не знаю, почему при использовании tab для навигации по форме не обновляется объект person, когда свойство привязки имеет значение Text, особенно когда нажатие по форме приводит к обновлению привязкикак и ожидалось.Как указано в исходном вопросе, мне все еще интересно услышать, почему существует такое различие в поведении.Если у кого-то есть понимание, мне было бы интересно услышать, почему это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...