private void _OnSignalREvent(string aEventName, object aEventData)
        {
            switch (aEventName)
            {
            case "ProductListCreated":
                {
                    var lEventData = (JObject)aEventData;
                    var lList = new ProductListDTO()
                    {
                        Id = (int)lEventData["Id"],
                        Name = (string)lEventData["Name"] 
                    };
                    lock (this.ProductLists)
                        mProductLists.Add(lList);

                    _NotifyPropertyChanged("ProductLists");
                }
                break;
            case "ProductListDeleted":
                {
                    var lEventData = (JObject)aEventData;
                    var lList = mProductLists.FirstOrDefault(aList => aList.Id == (int)lEventData["Id"]);
                    if (lList != null)
                    {
                        lock (this.ProductLists)
                            mProductLists.Remove(lList);

                        _NotifyPropertyChanged("ProductLists");
                    }
                }
                break;
            case "ProductEntryCreated":
                {
                    var lEventData = (JObject)aEventData;
                    var lList = mProductLists.FirstOrDefault(aList => aList.Id == (int)lEventData["ListId"]);
                    if (lList != null)
                    {
                        var lEntry = new ProductEntryDTO()
                        {
                            Id = (int)lEventData["Id"],
                            ProductName = (string)lEventData["Name"],
                            Amount = (int)lEventData["Amount"],
                            Comments = (string)lEventData["Comments"],
                            OwnerList = lList
                        };
                        lEntry.PropertyChanged += _OnProductEntryPropertyChanged;
                        lock (lList.mProductEntries)
                            lList.mProductEntries.Add(lEntry);

                        lList._NotifyPropertyChanged("ProductEntries");
                    }
                }
                break;
            case "ProductEntryEdited":
                {
                    var lEventData = (JObject)aEventData;
                    var lList = mProductLists.FirstOrDefault(aList => aList.Id == (int)lEventData["ListId"]);
                    if (lList != null)
                    {
                        var lEntry = lList.ProductEntries.FirstOrDefault(aEntry => aEntry.Id == (int)lEventData["Id"]);
                        if (lEntry != null)
                        {
                            lEntry.Amount = (int)lEventData["Amount"];
                            lEntry.Comments = (string)lEventData["Comments"];
                        }
                    }
                }
                break;
            case "ProductEntryDeleted":
                {
                    var lEventData = (JObject)aEventData;
                    var lList = mProductLists.FirstOrDefault(aList => aList.Id == (int)lEventData["ListId"]);
                    if (lList != null)
                    {
                        var lEntry = lList.ProductEntries.FirstOrDefault(aEntry => aEntry.Id == (int)lEventData["Id"]);
                        if (lEntry != null)
                        {
                            lock (lList.mProductEntries)
                                lList.mProductEntries.Remove(lEntry);

                            lList._NotifyPropertyChanged("ProductEntries");
                        }
                    }
                }
                break;
            }
        }
        public async Task QueryProductEntries(ProductListDTO aList)
        {
            using (this.SetBusy())
            {
                var lResponse = await mJSONRequester.Get(this.ServerURL, string.Format(APIConstants.URL_PRODUCT_ENTRIES, aList.Id), mRequestHeaders);
                lResponse.EnsureSuccessStatusCode();
                List<ProductEntryDTO> lProductEntries = await lResponse.Content.ReadAsAsync<List<ProductEntryDTO>>();

                //Unsuscribe from previous event listeners
                foreach (var lProductEntry in aList.ProductEntries)
                {
                    lProductEntry.PropertyChanged -= _OnProductEntryPropertyChanged;
                    lProductEntry.OwnerList = null;
                }
                //Suscribe to new product entries
                foreach (var lProductEntry in lProductEntries)
                {
                    lProductEntry.PropertyChanged += _OnProductEntryPropertyChanged;
                    lProductEntry.OwnerList = aList;
                }

                lock (aList.mProductEntries)
                {
                    aList.mProductEntries.Clear();
                    foreach (var lProductEntry in lProductEntries)
                        aList.mProductEntries.Add(lProductEntry);
                }
                aList._NotifyPropertyChanged("ProductEntries");
            }
        }