2012-04-26 70 views
0

我正在使用MVVM并在我的数据库中有一个字段,它是一个字符串并表示一个坐标。在屏幕上,我想将其分解为坐标部分,以方便用户进行编辑。到目前为止,我有一个类来帮助:WPF复合/级联字段

public class Coord 
{ 
    public int LatDegree {get;set;} 
    public int LatMinute {get;set;} 
    public int LatSecond {get;set;} 
    public char Latitude {get;set;} 
    public int LonDegree {get;set;} 
    public int LonMinute {get;set;} 
    public int LonSecond {get;set;} 
    public char Longitude {get;set;} 

    public Coord(string coord) 
    { 
      string[] coordAsString =coord.Split(' '); 
      this.LatDegree=Int32.Parse(coordAsString[0]); 
      this.LatMinute=Int32.Parse(coordAsString[1]); 
      this.LatSecond=Int32.Parse(coordAsString[2]); 
      this.Latitude = (coordAsString[3].ToCharArray())[0]; 
      this.LonDegree = Int32.Parse(coordAsString[4]); 
      this.LonMinute = Int32.Parse(coordAsString[5]); 
      this.LonSecond = Int32.Parse(coordAsString[6]); 
      this.Longitude = (coordAsString[7].ToCharArray())[0]; 
    } 

    public override string ToString() 
    { 
     string asString = String.Format(...//omitted for brevity 
     return asString; 
    } 
} 

在我的视图模型

  private Coord relativeGridOrigin; 
    private Coord RelativeGridOrigin 
    { 
     get 
     { 
      if(relativeGridOrigin==null) 
      { 
       relativeGridOrigin = new Coord(myMainObject.relativeGridOrigin); 
      } 
      return relativeGridOrigin; 
     } 
     set 
     { 
      relativeGridOrigin = value; 
      myMainObject.relativeGridOrigin = relativeGridOrigin.ToString(); 
     } 
    } 

和我目前正在结合lattitude degre控制:

  public int LatitudeDegree 
    { 
     get { return RelativeGridOrigin.LatDegree; } 
     set 
     { 
      RelativeGridOrigin.LatDegree = value; 
      myMainObject.relativeGridOrigin = relativeGridOrigin.ToString(); 
     } 
    } 

但我不t想要那LatitudeDegree包装(和其他7我需要) - 我想只绑定控制LatDegree在我的Coord对象,但我需要myMainObject.relativeGridOrigin任何时候改变这8个值之一更改_我认为一世 想要调用RelativeGridOrigin设置器。我想我需要将RelativeGridOrigin设置器传递给Coord类,或让我的视图模型监听Coord类的属性更改,但我不知道如何做,或者是否有另一种更好的方法。

+0

不幸的是,这正是MVVM模式所要求的:VM需要公开UI将使用的任何属性。您还需要在虚拟机中进行某种更新通知,它看起来不像您有任何更新通知。 – Tyrsius 2012-04-26 19:47:04

+0

对不起,我不明白你的意思是需要某种更新通知。我最终传递了一个委托来将relativeGridOrigin更新到Coord类中,并让每个setter调用它,但实际上它与我之前使用LatitudeDegree包装进行的操作相同。我想另一种方式是让Coord类在VM中提出事件并听取它。 – Nix 2012-04-27 07:24:26

回答

0

在此之后的答案矿MVVM pattern and dependent children 的另一个问题,我意识到这是很整齐,只是引发一个事件,只要任何坐标制定者改变了值,然后虚拟机可以听它和更新的主要对象