У меня есть простая обертка вокруг класса Vector3 (трехмерный вектор, предоставляемый OpenTK), который реализует интерфейс INotifyPropertyChanged. Я хочу, чтобы к этому вектору были привязаны три текстовых поля (координаты x, y и z). Моя оболочка (CameraVector) выглядит так:
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);
}
}
}
Это обеспечивает три свойства для TextBox, которые будут привязаны, в то же время позволяя другим областям приложения просто передавать (и получать) 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, обработчик события становится пустым. Насколько я понимаю, именно так связывание данных становится известно об изменениях. Итак, как говорится, я здесь что-то не так делаю? Я ОЧЕНЬ новичок в привязке данных в 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);