/// <summary>Проверяет, соответствует ли данный билет устройства данной модели представления устройства</summary>
 private bool CanTicketApplyToDevice(DeviceViewModel dev, DeviceTicket ticket)
 {
     return
         ticket.BlockId == dev.CellId &&
         ticket.Module == dev.ModuleNumber &&
         ticket.Modification == dev.ModificationNumber &&
         ticket.BlockSerialNumber == dev.SerialNumber;
 }
 private void OnDeviceSelected(DeviceViewModel Device)
 {
     Device.RefreshProperties();
 }
        /// <summary>Синхронизирует список устройств в соответствии со списком билетов</summary>
        private void SyncronizeDeviceList(IList<DeviceTicket> Tickets)
        {
            foreach (var dev in Devices)
                dev.Tickets.Clear();

            foreach (var t in Tickets)
            {
                DeviceViewModel DeviceVM = Devices.FirstOrDefault(dev => CanTicketApplyToDevice(dev, t));
                if (DeviceVM == null)
                {
                    DeviceVM = new DeviceViewModel(t);
                    Devices.Add(DeviceVM);
                }
                DeviceVM.Tickets.Add(t);
            }

            foreach (var dev in Devices.Where(dev => !dev.Tickets.Any()).ToList())
                Devices.Remove(dev);
        }