Мне нужно отобразить в DataGrid набор битовых состояний, полученных из внешнего источника.Для этого я использую ObservableCollection следующим образом
public class UpdateIO : INotifyPropertyChanged
public static ObservableCollection<IObitDetails> PlcCommonOutputs = new ObservableCollection<IObitDetails>();
Мой класс IObitDetails равен
public class IObitDetails : INotifyPropertyChanged
{
bool _bitValue;
public string BitGroup { get; set; }
public string BitText { get; set; }
public short CIOaddress { get; set; }
public short BitPosition { get; set; }
public bool BitValue
{
get { return _bitValue; }
set { SetField(ref _bitValue, value); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetField<T>(ref T field, T value,
[CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value))
return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
public IObitDetails(string bg, bool bv, string bt, short adr, short pos)
{
BitGroup = bg;
BitValue = bv;
BitText = bt;
CIOaddress = adr;
BitPosition = pos;
}
}
Далее я создал коллекцию
PlcCommonOutputs.Add(new IObitDetails("CO", oCommonOpLampRed,"Op. Red", 0x0001, obitCommonOpLampRed));
PlcCommonOutputs.Add(new IObitDetails("CO", oCommonOpLampGreen,"Op. Green", 0x0001, obitCommonOpLampGreen));
PlcCommonOutputs.Add(new IObitDetails("CO", oCommonMuteA,"MuteA", 0x0001, obitCommonMuteA));
PlcCommonOutputs.Add(new IObitDetails("CO", oCommonMuteB,"MuteB", 0x0001, obitCommonMuteB));
...
Здесь битовые позицииобъявлен как:
private const short obitCommonOpLampRed = 0;
private const short obitCommonOpLampGreen = 1;
private const short obitCommonMuteA = 2;
private const short obitCommonMuteB = 3;
...
Каждый бит является свойством, которое изменяется, когда я читаю (в потоке опроса) порт и сохраняю в oCommonOutputsPost:
private short _oCommonOutputsPort;
public short oCommonOutputsPort
{
get { return _oCommonOutputsPort; }
set
{
SetField(ref _oCommonOutputsPort, value);
oCommonOpLampRed = (oCommonOutputsPort & (1 << obitCommonOpLampRed)) != 0;
oCommonOpLampGreen = (oCommonOutputsPort & (1 << obitCommonOpLampGreen)) != 0;
oCommonMuteA = (oCommonOutputsPort & (1 << obitCommonMuteA)) != 0;
oCommonMuteB = (oCommonOutputsPort & (1 << obitCommonMuteB)) != 0;
}
}
private bool _oCommonOpLampRed;
public bool oCommonOpLampRed
{
get { return _oCommonOpLampRed; }
set { SetField(ref _oCommonOpLampRed, value); }
}
private bool _oCommonOpLampGreen;
public bool oCommonOpLampGreen
{
get { return _oCommonOpLampGreen; }
set { SetField(ref _oCommonOpLampGreen, value); }
}
}
private bool _oCommonMuteA;
public bool oCommonMuteA
{
get { return _oCommonMuteA; }
set { SetField(ref _oCommonMuteA, value); }
}
private bool _oCommonMuteB;
public bool oCommonMuteB
{
get { return _oCommonMuteB; }
set { SetField(ref _oCommonMuteB, value); }
}
...
Всякий раз, когда я читаю новыйзначение порта, биты устанавливаются / сбрасываются (я вижу, что свойства битов изменены правильно).Но ObservableCollection (PlcCommonOutputs) не изменяется.Если я вручную изменяю в отладчике соответствующие значения BitValue в коллекции, они отображаются в пользовательском интерфейсе (поэтому я не включаю xaml).Есть ли способ сделать это без значительного увеличения сложности кода?