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