2012-03-19 3 views
0

У меня есть простая оболочка вокруг класса 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); 

ответ

0

BindingSource делает подсечки из INotifyProperty изменил обработчик (и BindingList поднимает ListChanged события для вас автоматически, если свойство в списке изменяется).

Создайте объект BindingSource, устанавливает его свойство DataSource в ваш m_center.

Когда вы создаете свои привязки, передайте BindingSource в качестве второго аргумента, а не m_center.

Документы INotifyPropertyChanged действительно имеют пример. Они используют BindingList, но он должен указывать на вас в правильном направлении.

+0

ОК, обработчик событий больше не равен нулю. Я не знаю, как я пропустил это в этом примере ... Я определенно смотрел на него. В любом случае обработчик выполняет, но TextBox не обновляется. Я захватил событие TextChanged и его вызывается только один раз при инициализации. Я проследил до того, где обработчик получил вызов. Любая идея, что я мог бы здесь найти? Или любую дополнительную информацию, которую я мог бы предоставить? Спасибо – ctartamella

+0

опубликовать обновленный код с помощью BindingSource. –

+0

Обновленный код, указанный выше. Еще раз спасибо. – ctartamella

Смежные вопросы