xamarin связывает массив байтов с метками сетки - PullRequest
0 голосов
/ 25 апреля 2018

Я хочу привязать байт [] к метке разницы в виде сетки, но странно, когда я изменяю значение в событии таймера, onPropertyChanged () не вызывается, оказывается, метка не обновлялась с помощью byte []. Просьба помочь мне, где ошибка в моем коде. Я могу связать байт с кодом, который я перечисляю, но, кажется, не работает с байтом []. Спасибо!

System.Timers.Timer testtimer;
    Grid gridView;
    byte[] _recvdata;
    byte testbyte;
    public byte[] RecvData
    {
        get
        {
            return _recvdata;
        }
        set
        {
            if (_recvdata != value)
            {
                _recvdata = value;
                OnPropertyChanged("RecvData");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected override void OnPropertyChanged(string propertyName)
    {
        var changed = PropertyChanged;
        if (changed != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public DevicePage(IDevice currDevice)
    {
        device = currDevice;
        this.Title = "Status";
        testtimer = new System.Timers.Timer();
        testtimer.Interval = 1000;
        testtimer.Elapsed += OnTimedEvent;
        testtimer.Enabled = true;

        gridView = new Grid();
        RecvData = new byte[40];

        for (byte i = 0; i < 40;i++)
        {
            string st;
            var lb = new Label ();
            st = "RecvData[" + i + "]";
            lb.SetBinding(Label.TextProperty, st);
            lb.BindingContext = this;
            gridView.Children.Add(lb, 0, i);
        }

        this.Content = gridView;
    }
    private void OnTimedEvent(object sender, System.Timers.ElapsedEventArgs e)
    {
        byte i;
        testbyte += 1;

        for (i = 0; i < 40; i++)
        {
            RecvData[i] = testbyte;
        }
    }

1 Ответ

0 голосов
/ 25 апреля 2018

Установщик свойства RecvData не вызывается, когда вы просто изменяете его с помощью [indexer].У меня есть два варианта:

1) вручную вызвать OnPropertyChanged после изменения байтового массива с помощью индексатора:

    private void OnTimedEvent(object sender, System.Timers.ElapsedEventArgs e)
    {
        byte i;
        testbyte += 1;

        for (i = 0; i < 40; i++)
        {
            RecvData[i] = testbyte;
        }

        OnPropertyChanged("RecvData");
    }

2) создать оболочку для байтового массива, которая будет вызывать OnPropertyChanged автоматически привы изменяете массив с помощью индексатора:

public class ByteArrayWrapper : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    byte[] _array;
    public byte[] Array
    {
        get
        {
            return _array;
        }
        set
        {
            if (_array != value)
            {
                _array = value;
                OnPropertyChanged("Array");
            }
        }
    }

    public byte this[int index]
    {
        get
        {
            return _array[index];
        }

        set
        {
            _array[index] = value;
            OnPropertyChanged("Array");
        }
    }

    protected void OnPropertyChanged(string propertyName)
    {
        var changed = PropertyChanged;
        if (changed != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

, а затем вместо работы с вашим байтовым массивом, как это:

public byte[] RecvData
{
 // get/set
}

, вы должны использовать экземпляр вышеупомянутого класса:

public ByteArrayWrapper RecvData
{
 // get/set
}

Другой код должен быть в порядке.Если привязка не работает, возможно, вам нужно привязать к RecvData.Array [i] вместо RecvData [i], пожалуйста, дайте мне знать, если это работает, поскольку я не могу проверить прямо сейчас.

...