2012-03-19 42 views
0

我所擁有的是圍繞類Vector3(由OpenTK提供的3-D矢量)實現INotifyPropertyChanged接口的簡單包裝。我想有三個文本框綁定到這個向量(x,y和z座標)。我的包裝(CameraVector)看起來像:PropertyChangedEventHandler爲空

public class CameraVector : INotifyPropertyChanged 
    { 
    public event PropertyChangedEventHandler PropertyChanged; 
    private Vector3 m_vector; 

    public CameraVector() 
     { 
     m_vector = new Vector3(); 
     } 

    public CameraVector (Vector3 vector) 
     { 
     m_vector = vector; 
     } 

    public CameraVector (float x, float y, float z) 
     { 
     m_vector = new Vector3 (x, y, z); 
     } 

    public String CoordX 
     { 
     get { return Convert.ToString (m_vector.X); } 
     set 
      { 
      if (CoordX != value) 
       { 
       m_vector.X = Convert.ToSingle (value); 
       OnPropertyChanged (new PropertyChangedEventArgs ("CoordX")); 
       } 
      } 
     } 

    public String CoordY 
     { 
     get { return Convert.ToString (m_vector.Y); } 
     set 
      { 
      if (CoordY != value) 
       { 
       m_vector.Y = Convert.ToSingle (value); 
       OnPropertyChanged (new PropertyChangedEventArgs ("CoordY")); 
       } 
      } 
     } 

    public String CoordZ 
     { 
     get { return Convert.ToString (m_vector.Z); } 
     set 
      { 
      if (CoordZ != value) 
       { 
       m_vector.Z = Convert.ToSingle (value); 
       OnPropertyChanged (new PropertyChangedEventArgs ("CoordZ")); 
       } 
      } 
     } 

    public Vector3 Vector 
     { 
     get { return m_vector; } 
     set 
      { 
      CoordX = Convert.ToString (value.X); 
      CoordY = Convert.ToString (value.Y); 
      CoordZ = Convert.ToString (value.Z); 
      } 
     } 

    protected void OnPropertyChanged (PropertyChangedEventArgs e) 
     { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      { 
      handler (this, e); 
      } 
     } 
    } 

這提供了三個屬性的文本框綁定到在允許應用的其他領域只是傳遞(和接收)一個直接的Vector3。在含有形式​​,我有:

m_center = new CameraVector (0.0f, 0.0f, 0.0f); 
txtCameraX.DataBindings.Add ("Text", m_center, "CoordX"); 
txtCameraY.DataBindings.Add ("Text", m_center, "CoordY"); 
txtCameraZ.DataBindings.Add ("Text", m_center, "CoordZ"); 

的問題是,當我進入我的OnPropertyChanged方法,事件處理程序爲null。我的理解是,這就是數據綁定如何意識到這種變化。所以,這就是說,我在這裏做錯了什麼?我在C#中非常新的數據綁定,所以任何批評都是值得歡迎的。

編輯:每下面的建議,我已經做到了這一點:

m_bindCenter.DataSource = m_center; 
txtCameraX.DataBindings.Add ("Text", m_bindCenter, "CoordX", false, DataSourceUpdateMode.OnPropertyChanged); 
txtCameraY.DataBindings.Add ("Text", m_bindCenter, "CoordY", false, DataSourceUpdateMode.OnPropertyChanged); 
txtCameraZ.DataBindings.Add ("Text", m_bindCenter, "CoordZ", false, DataSourceUpdateMode.OnPropertyChanged); 

回答

0

BindingSource確實INotifyProperty的掛鉤改變處理器(和自動的BindingList引發的ListChanged事件如果您在列表中的屬性發生更改)。

創建BindingSource,將其DataSource屬性設置爲您的m_center。

當您創建綁定時,請將BindingSource作爲第二個參數傳遞,而不是m_center。

INotifyPropertyChanged docs實際上有一個示例。他們使用BindingList,但它應該指向正確的方向。

+0

好吧,事件處理程序不再爲空。我不知道我在那個例子中錯過了什麼......我絕對正在看那個。無論如何,該處理程序執行但TextBox不更新。我捕獲了TextChanged事件,它只在初始化時被調用一次。然而,我確實跟蹤了處理程序被調用的地方。任何想法我可以在這裏找到?或者我可以提供的其他信息?謝謝 – ctartamella 2012-03-19 05:19:06

+0

使用BindingSource發佈更新的代碼。 – 2012-03-19 05:55:59

+0

上面發佈的更新代碼。再次感謝。 – ctartamella 2012-03-19 18:19:51

相關問題