0

更新:我把问题表述错了。内部和外部纬度/经度成员都需要相互更新,从而导致递归。外部成员由数据库上下文更新,而内部成员由 UI 更新。因此,数据库中的任何更改都必须传播到 UI,反之亦然。Coordinates 类不能与 UI 分离,外部成员不能与数据库分离。

我想一个防止递归的标志将是解决这个问题的最简单方法。

我有以下课程:

class Coordinates
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

class Location
{
    public string Name { get; set; }

    public Coordinates Coordinates { get; set; }

    public double CoordinateLatitude
    {
        get { return (this.Coordinates.Latitude); }
        set { /* This member needs to get updated every time Location.Coordinates.Latitude gets updated. */ }
    }

    public double CoordinateLongitude
    {
        get { return (this.Coordinates.Latitude); }
        set { /* This member needs to get updated every time Location.Coordinates.Latitude gets updated. */ }
    }
}

成员CoordinateLatitudeCoordinateLongitude映射到坐标类。我想要实现的也是相反的。所以当Coordinates类更新时,类的成员Location也应该更新。不要问我为什么代码的结构是这样的,因为我目前无权更改它。

整个项目中有很多代码设置了 Coordinates 类的成员:location.Coordinates.Latitude = 10.0D;等。由于Coordinates该类(和许多其他类)是轻量级数据结构,并且在许多地方被粗心地使用,我不想将它们捆绑起来到事件。

我的问题是,如何让 Location.Coordinates 成员更新 Location.CoordinateLatitude 值?有没有一种标准的方法来设置这样的回调而不需要IDisposable清理(就像事件一样)?

4

4 回答 4

1

但是 CoordinateLatitude 确实得到了更新
我测试了你的代码

Location myLoc = new Location();
myLoc.Coordinates = new Coordinates();
myLoc.Coordinates.Latitude = 10;
System.Diagnostics.Debug.WriteLine(myLoc.CoordinateLatitude.ToString());
myLoc.Coordinates.Latitude = 20;
System.Diagnostics.Debug.WriteLine(myLoc.CoordinateLatitude.ToString());

可能您要问的是为什么 UI 不更新

完全不清楚哪个是内部的,哪个是外部的,以及你在哪里得到递归。
他们不(不应该)互相更新。
他们都只是引用同一个对象。

这对我有用。

class Coordinates
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}

class Location : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
    public string Name { get; set; }
    private Coordinates coordinates = new Coordinates();
    public Coordinates Coordinates 
    {
        get { return coordinates; }
        set
        {
            if (coordinates == value) return;
            coordinates = value;
            NotifyPropertyChanged("Coordinates");
            NotifyPropertyChanged("CoordinateLatitude");
            NotifyPropertyChanged("CoordinateLongitude");
        }
    }

    public double CoordinateLatitude
    {
        get { return (this.Coordinates.Latitude); }
        set { this.Coordinates.Latitude = value; }
    }

    public double CoordinateLongitude
    {
        get { return (this.Coordinates.Longitude); }
        set { this.Coordinates.Longitude = value; }
    }
}
于 2013-05-06T17:44:00.230 回答
0

您的代码中有一个错误:

public double CoordinateLatitude
    {
        get { return (this.Coordinates.Latitude); }
        set { /* This member needs to get updated every time Location.Coordinates.Latitude gets updated. */ }
    }

    public double CoordinateLongitude
    {
        get { return (this.Coordinates.Latitude); }
        set { /* This member needs to get updated every time Location.Coordinates.Latitude gets updated. */ }
    }

更改Latitude为. CoordinateLongitude_ Longitude另外,我不建议您单独存储它们。由于它们通常对应于需要坐标的纬度和经度的点,因此单独存储它们是没有意义的。这只需要一个电话,您就可以CoordinateLatitude/Longitude完全消除。

话虽如此,您所要做的就是添加这些设置器:

set { this.Coordinates.Latitude = value; }

set { this.Coordinates.Longitude = value; }

于 2013-05-06T17:35:27.880 回答
0

Coordinates是一个类,所以如果你改变它,任何使用同一个实例的变量都会自动更新。假设我理解你想要正确完成的事情,你的集合可以是:

public double CoordinateLatitude
{
    get { return (this.Coordinates.Latitude); }
    set { this.Coordinates.Latitude = value; }
}

public double CoordinateLongitude
{
    get { return (this.Coordinates.Longitude); }
    set { this.Coordinates.Longitude = value;  }
}

Coordinates编辑:如果是结构,这将需要以不同的方式完成。这是因为this.Coordinates在这种情况下会检索副本。

public double CoordinateLongitude
{
    get { return (this.Coordinates.Longitude); }
    set {
        Coordinate temp = this.Coordinates;
        temp.Longitude = value;
        this.Coordinates = temp;
    }
}
于 2013-05-06T17:36:41.530 回答
0

由于Coordinates已经是Location您从 in 中读取的属性,因此CoordinateLatitude您已经完成了它。从 读取与从Location.Coordinate.Latitude读取相同Location.CoordinateLatitude

public Coordinates Coordinates { get; set; }

public double CoordinateLatitude
{
  get { return (this.Coordinates.Latitude); }
  set { this.Coordinates.Latitude = value;}
}

在您的设置器中,您可以更新它以设置Location.Coordinate.Latitude值,或者只是删除设置以使其成为只读属性。

于 2013-05-06T17:44:20.197 回答