У меня есть простая оболочка вокруг класса Vector3 (трехмерный вектор, предоставляемый OpenTK), который реализует интерфейс INotifyPropertyChanged. Я хочу иметь три текстовых поля, привязанных к этому вектору (координаты x, y и z). Моя обертка (CameraVector) выглядит следующим образом:СвойствоChangedEventHandler имеет значение null
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);
}
}
}
Это обеспечивает три свойства для TextBoxes быть связанным, позволяя другую область применения, чтобы просто передать (и получить) а 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#, поэтому любая критика приветствуется.
EDIT: Пер ниже предложение я сделал это:
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
опубликовать обновленный код с помощью BindingSource. –
Обновленный код, указанный выше. Еще раз спасибо. – ctartamella