【问题标题】:How do you make properties with interdependent values?如何创建具有相互依赖值的属性?
【发布时间】:2017-04-08 03:09:22
【问题描述】:

在 WPF 中,我想为属性创建三个文本框:FullName、FirstName 和 LastName。这些文本框的文本将基于左侧的列表框(如下面的程序图像所示)。我已经完成了从列表框获取文本到文本框的工作,但我想同步名称的值,例如:

更改 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));
    }
}

【问题讨论】:

  • 关于名称之间缺少空格...这不是故意的

标签: c# wpf data-binding properties inotifypropertychanged


【解决方案1】:

我相信您将需要一个如下所示的课程。然后,您将列表框绑定到这些集合,并将表单元素绑定到当前选定的项目。

我在名字和姓氏之间添加了一个空格。如果您想删除它,您需要找到另一种拆分名字和姓氏的方法,例如检查大小写。

由于无论修改哪个属性都会设置 FullName,因此我将所有 FirePropertyChanged 调用放在其设置器中。我没有对此进行测试,但我认为它会起作用。 :)

编辑:更改 FullName 设置器以设置 firstName 和 lastName 的私有变量而不是公共属性。

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

【讨论】:

  • 感谢您的回复,但遗憾的是它导致了 StackOverFlowException
  • 设法通过对您的答案进行小的更正来解决它。再次感谢您的回复:)
  • 我的错。对于那个很抱歉。总是同时做 10 件事。 :) 我所做的编辑应该防止死循环。
  • 哇,这比我的第一个解决方案好多了哈哈谢谢
猜你喜欢
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 2017-11-29
  • 2013-07-19
  • 2016-04-13
相关资源
最近更新 更多