C# WinForms控件数据绑定在通过标签切换时无效。

3
我在使用C# WinForms中的DataBindings时,用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;
    }
}

界面只包含几个文本框、组合框和数字选择控件,它们都与 PersonModel 的 person 绑定。当我用鼠标浏览界面并更改控件中的值时,程序按预期工作:当我点击“保存”按钮时,PersonModel 的 ToString() 方法显示所有属性已按预期更新。然而,当我重新启动应用程序并通过控件进行切换时,组合框(Gender 和 User Type)的数据绑定不会更新 person 中的值。当我切换到“保存”按钮并按下“Enter”键时,ToString() 方法显示 person 中的 Gender 和 UserType 属性未发生变化。
当通过界面进行单击时,所有输入值都正确地反映在 person 中。

Clicking through controls

在通过 UI 制表键时,输入的“性别”和“用户类型”值不会应用于它们各自的属性(请注意,“管理员”和“女性”的默认值保持不变)。

Tabbing through controls

这里的问题是什么?为什么当通过UI点击时数据绑定按预期工作,但当通过制表符切换时它们不起作用?我需要选择不同的PropertyName用于数据绑定中的组合框吗?如果Text不是在数据绑定中使用的正确PropertyName,那么为什么在通过控件单击时Text可以正常工作?
编辑:来自LarsTech的评论解决了我的问题,但对于社区的其他人,我仍然想听听任何关于为什么使用tab在我的表单上导航时不会更新数据绑定,而通过单击表单却可以的想法。我知道当使用制表符而不是单击时focus events differ when when using tab as opposed to clicking。然而,由于所有相同的事件仍然被触发,我不知道这是否可以解释差异。

1
cmbUserType.DataBindings.Add("Text" 的翻译是: cmbUserType.DataBindings.Add("Text"。对于一个 ComboBox 来说,Text 可能不是你想要的属性。如果你设置了 DataSource 和 ValueMember,则尝试使用 SelectedItem 或 SelectedValue。 - LarsTech
@LarsTech 嗯,我记得我试过 SelectedItem,但可能是我记错了,因为它按预期工作,无论是通过切换选项卡还是点击。我猜我只是困惑为什么在点击时 Text 起作用,但在切换选项卡时却不起作用。 - Patrick Tucci
我不确定你说的是“选项卡”还是“点击”。为什么这两个动作会在这里产生任何影响呢? - LarsTech
因为一个能工作而另一个不能使用 "Text" 属性绑定。当我使用“tab”键在控件之间切换时,“Text”属性绑定不会将 ComboBox 值更新到“person”对象中。当我使用鼠标在控件之间单击时,“Text”属性绑定会更新 person 对象与 ComboBox 值。 - Patrick Tucci
@LarsTech,你的评论解决了我的问题,如果你能把它作为答案发布,我会将其标记为答案并点赞。 - Patrick Tucci
如果你有答案,就去自己发表吧。我还不确定为什么对于你来说,制表符的问题是个问题,除非数据通常在控件失去焦点之后才被提交。 - LarsTech
1个回答

1

如LarsTech在评论中提到的,将DataBindingPropertyText更改为SelectedItem会使表单按预期工作。当使用tab键在表单中导航时,DataBinding会更新绑定属性,就像我通过表单点击一样。

我仍然不明白为什么在绑定属性为Text时,使用tab键浏览表单不会更新person对象,尤其是当通过点击表单时可以正常更新绑定。如原问题所述,我仍然很好奇为什么行为上存在如此的差异。如果有人了解原因,我很想知道为什么会出现这种情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接