2012-03-19 6 views
0

私が持っているのは、INotifyPropertyChangedインターフェイスを実装しているクラスVector3(OpenTKによって提供される3Dベクトル)の周りの単純なラッパーです。このベクトル(x、y、z座標)に3つのテキストボックスをバインドしたいと思います。私のラッパー(CameraVector)は次のようになります。PropertyChangedEventHandlerが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); 
      } 
     } 
    } 

これは、直接アプリケーションの他の領域だけで合格(および受信)を可能にしながらにバインドするのTextBoxのVector3のための3つのプロパティを提供します。私が持っている含むフォームで:

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); 

答えて

0

BindingSourceはINotifyPropertyのフックはハンドラを変更しない(とリストの変更内のプロパティ場合するBindingListが自動的にListChangedイベントを発生させます)。

BindingSourceを作成し、DataSourceプロパティをm_centerに設定します。

バインディングを作成するときは、BindingSourceをm_centerではなく2番目の引数として渡します。

文書INotifyPropertyChanged文書には実際の例があります。 BindingListを使用していますが、正しい方向に向ける必要があります。

+0

OK、イベントハンドラはnullではありません。私はその例でそれを見逃したのか分からない...私は間違いなくそれを見ていた。とにかく、ハンドラは実行されますが、TextBoxは更新されません。 TextChangedイベントをトラップし、初期化時に一度しか呼び出されません。私はハンドラがどこに呼び出されるかまで追跡しました。私がここで何を探すことができるのか?または私が提供できる追加情報はありますか?ありがとう – ctartamella

+0

BindingSourceを使用して更新されたコードを投稿してください。 –

+0

更新されたコードが上に掲載されました。再度、感謝します。 – ctartamella