【问题标题】:xamarin binding byte array to grid labelsxamarin 将字节数组绑定到网格标签
【发布时间】:2018-10-05 10:21:50
【问题描述】:

我想在网格视图中将 byte[] 绑定到差异标签,但是当我更改计时器事件中的值时很奇怪,onPropertyChanged() 没有调用,结果标签没有更新byte[]。请帮我找出代码中的错误在哪里。我可以将一个字节与我列出的代码绑定,但似乎不适用于 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= somebytearray”这将起作用。但是如何更新依赖于数组中的一个元素?
  • 您找到解决方案了吗?

标签: xamarin binding inotifypropertychanged


【解决方案1】:

仅使用 [indexer] 更改 RecvData 属性的设置器时不会调用它。我看到你有两个选择:

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],请告诉我这是否有效,因为我现在无法测试。

【讨论】:

  • 有什么办法可以自动实现吗?也许是不同的 getter setter?
  • 你可以创建一个类来包装字节数组并实现一个索引器,它会在其中调用 OnPropertyChanged
  • 可以给我一个示例代码吗?我是新手,非常感谢!
  • @zyyphilip 我发布了一个简单的例子:)
  • 对不起,我迟到了!在我尝试了你的建议后,它成功地绑定了 RecvData.Array[i] 并通过 RecvData[i] 改变了值,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
相关资源
最近更新 更多