xamarin 将字节数组绑定到网格标签

xamarin binding byte array to grid labels

我想绑定一个 byte[] 到网格视图中的差异标签,但是当我在计时器事件中更改值时很奇怪,onPropertyChanged() 没有调用,结果标签没有更新使用 byte[]。请帮助我解决我的 code.I 中的错误在哪里可以将字节与我列出的代码绑定,但似乎不适用于 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;
        }
    }

RecvData 属性 的 setter 在您使用 [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
}

你应该使用上面的实例 class:

public ByteArrayWrapper RecvData
{
 // get/set
}

其他代码应该没问题。如果绑定不起作用,也许您需要绑定到 RecvData.Array[i] 而不是 RecvData[i],请告诉我这是否有效,因为我现在无法测试。