您如何使属性具有相互依赖的价值?
How do you make properties with interdependent values?
在 WPF 中,我想为属性创建三个文本框:FullName、FirstName 和 LastName。这些文本框的文本将基于左侧的列表框(如下面的程序图像所示)。我已经完成了从列表框到文本框的文本获取,但我想同步名称的值,这样:
更改全名的值,更改列表框、名字和姓氏框
更改 FirstName 和 LastName 的值会更改 FullName 和列表框
程序如下所示:
(Program image)
好的,感谢 Jared,我可以通过对他的回答做一些小改动来解决问题,但我不喜欢我的解决方案大声笑有人可以建议对此程序进行更好的修改吗?
class Student : INotifyPropertyChanged
{
private string name;
public string Name
{
get
{
return name;
}
set
{
FirstName = value.Split(" ".ToCharArray())?[0];
LastName = value.Split(" ".ToCharArray())?[1];
OnPropertyChanged("Name");
OnPropertyChanged("FirstName");
OnPropertyChanged("LastName");
}
}
private string firstName;
public string FirstName
{
get
{
return firstName;
}
set
{
firstName = value;
name = value + " " + LastName;
OnPropertyChanged("FirstName");
OnPropertyChanged("Name");
}
}
private string lastName;
public string LastName
{
get
{
return lastName;
}
set
{
lastName = value;
name = FirstName + " " + value;
OnPropertyChanged("LastName");
OnPropertyChanged("Name");
}
}
private Course _course;
public Course Course
{
get { return _course; }
set
{
_course = value;
OnPropertyChanged("Course");
}
}
private int _age;
public int Age
{
get { return _age; }
set
{
_age = value;
OnPropertyChanged("Age");
}
}
private DateTime _birthday;
public DateTime Birthday
{
get { return _birthday; }
set
{
_birthday = value;
OnPropertyChanged("Birthday");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我相信您需要的是 class 如下所示。然后,您会将列表框绑定到这些元素的集合,并将表单元素绑定到当前选定的项目。
我在名字和姓氏之间添加了一个 space。如果你想删除它,你需要找到另一种拆分名字和姓氏的方法,比如检查大小写。
由于无论修改哪个 属性 都会设置 FullName,因此我将所有 FirePropertyChanged 调用放在它的 setter 中。我没有对此进行测试,但我认为它会起作用。 :)
编辑:更改了 FullName setter 以设置 firstName 和 lastName 的私有变量,而不是 public 属性。
public class Student : INotifyPropertyChanged
{
public string FullName
{
get
{
return FirstName + " " + LastName;
}
set
{
firstName = value.Split(" ".ToCharArray())?[0];
lastName= value.Split(" ".ToCharArray())?[1];
FirePropertyChanged("FullName");
FirePropertyChanged("FirstName");
FirePropertyChanged("LastName");
}
}
private string firstName;
public string FirstName
{
get
{
return firstName;
}
set
{
firstName = value;
FullName = value + " " + LastName;
}
}
private string lastName;
public string LastName
{
get
{
return firstName;
}
set
{
lastName = value;
FullName = FirstName + " " + value;
}
}
public void FirePropertyChanged (string PropertyName)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(PropertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
在 WPF 中,我想为属性创建三个文本框:FullName、FirstName 和 LastName。这些文本框的文本将基于左侧的列表框(如下面的程序图像所示)。我已经完成了从列表框到文本框的文本获取,但我想同步名称的值,这样:
更改全名的值,更改列表框、名字和姓氏框
更改 FirstName 和 LastName 的值会更改 FullName 和列表框
程序如下所示: (Program image)
好的,感谢 Jared,我可以通过对他的回答做一些小改动来解决问题,但我不喜欢我的解决方案大声笑有人可以建议对此程序进行更好的修改吗?
class Student : INotifyPropertyChanged
{
private string name;
public string Name
{
get
{
return name;
}
set
{
FirstName = value.Split(" ".ToCharArray())?[0];
LastName = value.Split(" ".ToCharArray())?[1];
OnPropertyChanged("Name");
OnPropertyChanged("FirstName");
OnPropertyChanged("LastName");
}
}
private string firstName;
public string FirstName
{
get
{
return firstName;
}
set
{
firstName = value;
name = value + " " + LastName;
OnPropertyChanged("FirstName");
OnPropertyChanged("Name");
}
}
private string lastName;
public string LastName
{
get
{
return lastName;
}
set
{
lastName = value;
name = FirstName + " " + value;
OnPropertyChanged("LastName");
OnPropertyChanged("Name");
}
}
private Course _course;
public Course Course
{
get { return _course; }
set
{
_course = value;
OnPropertyChanged("Course");
}
}
private int _age;
public int Age
{
get { return _age; }
set
{
_age = value;
OnPropertyChanged("Age");
}
}
private DateTime _birthday;
public DateTime Birthday
{
get { return _birthday; }
set
{
_birthday = value;
OnPropertyChanged("Birthday");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
我相信您需要的是 class 如下所示。然后,您会将列表框绑定到这些元素的集合,并将表单元素绑定到当前选定的项目。
我在名字和姓氏之间添加了一个 space。如果你想删除它,你需要找到另一种拆分名字和姓氏的方法,比如检查大小写。
由于无论修改哪个 属性 都会设置 FullName,因此我将所有 FirePropertyChanged 调用放在它的 setter 中。我没有对此进行测试,但我认为它会起作用。 :)
编辑:更改了 FullName setter 以设置 firstName 和 lastName 的私有变量,而不是 public 属性。
public class Student : INotifyPropertyChanged
{
public string FullName
{
get
{
return FirstName + " " + LastName;
}
set
{
firstName = value.Split(" ".ToCharArray())?[0];
lastName= value.Split(" ".ToCharArray())?[1];
FirePropertyChanged("FullName");
FirePropertyChanged("FirstName");
FirePropertyChanged("LastName");
}
}
private string firstName;
public string FirstName
{
get
{
return firstName;
}
set
{
firstName = value;
FullName = value + " " + LastName;
}
}
private string lastName;
public string LastName
{
get
{
return firstName;
}
set
{
lastName = value;
FullName = FirstName + " " + value;
}
}
public void FirePropertyChanged (string PropertyName)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(PropertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}