我所擁有的是圍繞類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);
好吧,事件處理程序不再爲空。我不知道我在那個例子中錯過了什麼......我絕對正在看那個。無論如何,該處理程序執行但TextBox不更新。我捕獲了TextChanged事件,它只在初始化時被調用一次。然而,我確實跟蹤了處理程序被調用的地方。任何想法我可以在這裏找到?或者我可以提供的其他信息?謝謝 – ctartamella 2012-03-19 05:19:06
使用BindingSource發佈更新的代碼。 – 2012-03-19 05:55:59
上面發佈的更新代碼。再次感謝。 – ctartamella 2012-03-19 18:19:51