2012-03-19 89 views
0

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

回答

0

BindingSource确实INotifyProperty的挂钩改变处理器(和自动的BindingList引发的ListChanged事件如果您在列表中的属性发生更改)。

创建BindingSource,将其DataSource属性设置为您的m_center。

当您创建绑定时,请将BindingSource作为第二个参数传递,而不是m_center。

INotifyPropertyChanged docs实际上有一个示例。他们使用BindingList,但它应该指向正确的方向。

+0

好吧,事件处理程序不再为空。我不知道我在那个例子中错过了什么......我绝对正在看那个。无论如何,该处理程序执行但TextBox不更新。我捕获了TextChanged事件,它只在初始化时被调用一次。然而,我确实跟踪了处理程序被调用的地方。任何想法我可以在这里找到?或者我可以提供的其他信息?谢谢 – ctartamella 2012-03-19 05:19:06

+0

使用BindingSource发布更新的代码。 – 2012-03-19 05:55:59

+0

上面发布的更新代码。再次感谢。 – ctartamella 2012-03-19 18:19:51

相关问题