在控件之间切换时C#WinForms数据绑定不起作用

时间:2018-12-12 17:02:20

标签: c# winforms data-binding

使用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;
    }
}

UI只是绑定到PersonModel person的几个TextBoxes,ComboBoxes和NumericUpDown控件。当我用鼠标单击UI并更改控件中的值时,程序将按预期工作:当我单击Save时,ToString()的{​​{1}}方法显示所有属性已按预期更新。但是,当我重新启动应用程序并通过控件使用Tab键时,组合框的数据绑定(对于PersonModelGender)不会更新User Type中的值。当我跳至person并按下Save时,Enter方法显示ToString()中的GenderUserType属性没有改变。 / p>

在单击UI时,所有输入值均正确反映在person中:

Clicking through controls

在用户界面中切换时,personGender的输入值不会应用于各自的属性(请注意,UserTypeAdmin的默认值保持不变):

Tabbing through controls

这是什么问题?为什么在单击UI时数据绑定能按预期工作,但是在通过Tab键浏览时却不能按预期工作?我是否需要为数据绑定中的组合框选择其他Female?如果PropertyName不是在数据绑定中使用的正确权限Text,为什么在单击控件时PropertyName可以正常工作?

编辑:来自LarsTech的评论解决了我的问题,但是对于其他社区,我仍然想听听有关为什么使用Text导航我的表单时不更新数据绑定的任何想法。形式呢。我知道focus events differ when when using tab as opposed to clicking。但是,由于仍然触发所有相同的事件,所以我不知道这是否可以解释差异。

1 个答案:

答案 0 :(得分:0)

正如LarsTech在评论中提到的那样,将DataBinding PropertyText更改为SelectedItem会使表格按预期方式工作。使用tab浏览表单时,DataBinding会更新绑定属性,就像我单击表单一样。

我仍然不知道为什么在绑定属性为tab时使用person浏览表单不会更新Text对象,尤其是在单击表单时导致绑定以按预期更新。如原始问题所述,我仍然很好奇为什么行为如此不同。如果有人有任何见识,我很想知道为什么会这样。