2013-05-06 41 views
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类的成员也应该更新。不要问我为什么代码的结构是这样的,因为我现在无权改变它。

还有就是整个代码,设置坐标类的成员项目一标段:location.Coordinates.Latitude = 10.0D;等。因为Coordinates类(和许多其他人)是轻量级的数据结构,并在很多地方不小心使用,我做不想把他们和事件联系起来。

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

+0

听起来像你需要一个属性事件监听器,即使你不想要事件.. – 2013-05-06 17:29:13

+1

这似乎已经这样做了你在问什么... – FlyingStreudel 2013-05-06 17:29:43

+2

如果你连接'set'方法的基本方式相同'get'方法,它应该做你想做的事,不是?不需要回调。将您的公共属性'CoordinateLatitude'和'CoordinateLongitude'想象为'Coordinates'成员相应属性的别名。 – 2013-05-06 17:31:25

回答

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不会更新

这是不完全清楚这是内在,哪些是外部和你得到rerecursion。
他们不(不应该)互相更新。
他们都只是引用同一个对象。

这适用于我。

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; } 
    } 
} 
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. */ } 
    } 

变化LatitudeCoordinateLongitudeLongitude。另外,我不建议你分开存储这些。由于它们通常对应于同时需要坐标的纬度和经度的点,因此独立存储它们是没有意义的。这只需要一个电话,你可以完全消除CoordinateLatitude/Longitude

话虽这么说,所有你需要做的就是添加这些setter方法:

set { this.Coordinates.Latitude = value; }

set { this.Coordinates.Longitude = value; }

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

由于Coordinates已经从在CoordinateLatitude您的阅读,你已经完成它的Location的属性。 Location.Coordinate.Latitude的读数与Location.CoordinateLatitude的读数相同。

public Coordinates Coordinates { get; set; } 

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

在你的setter,你可以更新它来设置Location.Coordinate.Latitude值或只是删除设置,使之成为只读属性。