PropertyChangedEventHandler является нулем - PullRequest
0 голосов
/ 19 марта 2012

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

1 Ответ

0 голосов
/ 19 марта 2012

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

Создайте BindingSource, задайте его свойство DataSourceв ваш m_center.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...