ObservableCollection не обновляется, хотя я INotifyPropertyChanged реализован - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно отобразить в 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).Есть ли способ сделать это без значительного увеличения сложности кода?

1 Ответ

0 голосов
/ 27 марта 2019

Легким решением для этого будет поднять значение свойства изменилось, когда в вашем установщике для значений, которые вы хотите обновить. Примером этого может быть:

private bool _oCommonMuteA;
public bool oCommonMuteA
{
    get { return _oCommonMuteA; }
    set 
    { 
        SetField(ref _oCommonMuteA, value); 
        OnPropertyChanged(nameof(oCommonMuteA));
    }
 }
...