我在使用C# WinForms中的
界面只包含几个文本框、组合框和数字选择控件,它们都与 PersonModel 的 person 绑定。当我用鼠标浏览界面并更改控件中的值时,程序按预期工作:当我点击“保存”按钮时,PersonModel 的 ToString() 方法显示所有属性已按预期更新。然而,当我重新启动应用程序并通过控件进行切换时,组合框(Gender 和 User Type)的数据绑定不会更新 person 中的值。当我切换到“保存”按钮并按下“Enter”键时,ToString() 方法显示 person 中的 Gender 和 UserType 属性未发生变化。
当通过界面进行单击时,所有输入值都正确地反映在 person 中。 在通过 UI 制表键时,输入的“性别”和“用户类型”值不会应用于它们各自的属性(请注意,“管理员”和“女性”的默认值保持不变)。 这里的问题是什么?为什么当通过UI点击时数据绑定按预期工作,但当通过制表符切换时它们不起作用?我需要选择不同的
编辑:来自LarsTech的评论解决了我的问题,但对于社区的其他人,我仍然想听听任何关于为什么使用
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 中。 在通过 UI 制表键时,输入的“性别”和“用户类型”值不会应用于它们各自的属性(请注意,“管理员”和“女性”的默认值保持不变)。 这里的问题是什么?为什么当通过UI点击时数据绑定按预期工作,但当通过制表符切换时它们不起作用?我需要选择不同的
PropertyName
用于数据绑定中的组合框吗?如果Text
不是在数据绑定中使用的正确PropertyName
,那么为什么在通过控件单击时Text
可以正常工作?编辑:来自LarsTech的评论解决了我的问题,但对于社区的其他人,我仍然想听听任何关于为什么使用
tab
在我的表单上导航时不会更新数据绑定,而通过单击表单却可以的想法。我知道当使用制表符而不是单击时focus events differ when when using tab as opposed to clicking。然而,由于所有相同的事件仍然被触发,我不知道这是否可以解释差异。
cmbUserType.DataBindings.Add("Text"
的翻译是:cmbUserType.DataBindings.Add("Text"
。对于一个 ComboBox 来说,Text 可能不是你想要的属性。如果你设置了 DataSource 和 ValueMember,则尝试使用 SelectedItem 或 SelectedValue。 - LarsTechSelectedItem
,但可能是我记错了,因为它按预期工作,无论是通过切换选项卡还是点击。我猜我只是困惑为什么在点击时Text
起作用,但在切换选项卡时却不起作用。 - Patrick Tucciperson
对象与 ComboBox 值。 - Patrick Tucci