我所拥有的是围绕类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