2016-06-22 1 views
0

Ich habe eine App mit einer Xamarin Forms Listview, die von einer ObservableCollection gefüttert wird, um Benutzerspiele aufzulisten, die ich von meinem Server abrufe. Das erste Mal, wenn ich es auflade, funktioniert es gut. Wenn ich diese vorhandene ObservableCollection auf irgendeine Weise modifiziere, stürzt meine App mit einer NullException ab. Ich habe es auf mein benutzerdefiniertes ViewCell (GameCell) beschränkt und das habe ich unten gepostet. Wenn ich eine Zeile aus in Richtung der Unterseite Kommentar:ListView Absturz beim Neuladen mit meiner benutzerdefinierten Zelle

this.SetBinding(IsEnabledProperty, "Enabled"); 

Dann stürzt es nicht mehr die ObservableCollection Aktualisierung, aber dann nicht bekomme ich mehr die Funktionalität einige Zellen aktiviert und einige deaktiviert Zellen. Ich vermute, es versucht, die IsEnabled-Eigenschaft auf eine Zelle zu setzen, die nicht mehr existiert, weil sie bei meinem Neuladen entfernt wurde. Irgendwelche Ideen, wie dies ohne zu crashen? BTW, das funktioniert auf Android in Ordnung, nur nicht auf iOS

using System; 
using Xamarin.Forms; 
using FFImageLoading.Forms; 

namespace Upwords 
{ 
    public class GameCell : ViewCell 
    { 
     public GameCell() 
     { 

      var icon = new CachedImage() { 
       Aspect = Aspect.AspectFit, 
       HorizontalOptions = LayoutOptions.Fill, 
       VerticalOptions = LayoutOptions.Fill, 
       BackgroundColor = AppStyle.IconColor, 
       IsVisible = false, 
      }; 
      icon.SetBinding (CachedImage.SourceProperty, "Icon"); 
      icon.SetBinding (CachedImage.LoadingPlaceholderProperty, "IconPlaceholder"); 
      icon.SetBinding (CachedImage.ErrorPlaceholderProperty, "IconPlaceholder"); 

      icon.SetBinding (CachedImage.WidthRequestProperty, "Height"); 
      icon.SetBinding (CachedImage.HeightRequestProperty, "Height"); 
      icon.Success += (object sender, CachedImageEvents.SuccessEventArgs e) => { 
       icon.FadeAnimationEnabled = false; 
       if(icon.Source.GetType() == typeof(Xamarin.Forms.UriImageSource)) { 
        icon.BackgroundColor = Color.Transparent; 
       } 
      }; 

      icon.PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) => { 

       if(icon.Source != null) 
        icon.IsVisible = true; 
       else 
        icon.IsVisible = false; 

      }; 

      var nameLabel = new Label() { 
       FontFamily = "Helvetica", 
       FontAttributes = FontAttributes.Bold, 
       FontSize = Device.GetNamedSize (NamedSize.Medium, typeof(Label)), 
       TextColor = Color.Black, 
      }; 
      nameLabel.SetBinding (Label.TextProperty, "Name"); 

      //Hide label if it's blank 
      nameLabel.PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) => { 
       if(nameLabel.Text == "") 
        nameLabel.IsVisible = false; 
       else 
        nameLabel.IsVisible = true; 
      }; 

      var detailsLabel = new Label() { 
       FontFamily = "Helvetica", 
       FontSize = Device.GetNamedSize (NamedSize.Small, typeof(Label)), 
       FontAttributes = FontAttributes.Bold, 
       TextColor = Color.FromHex ("#666"), 
       IsVisible = false, 

      }; 
      detailsLabel.SetBinding (Label.TextProperty, "Details"); 

      //Hide label if it's blank 
      detailsLabel.PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) => { 
       if(string.IsNullOrEmpty(detailsLabel.Text)) 
        detailsLabel.IsVisible = false; 
       else 
        detailsLabel.IsVisible = true; 
      }; 

      var textLayout = new StackLayout { 
       Padding = new Thickness (5, 0, 0, 0), 
       Spacing = 0, 
       HorizontalOptions = LayoutOptions.FillAndExpand, 
       VerticalOptions = LayoutOptions.CenterAndExpand, 
       Children = { nameLabel, detailsLabel} 
      }; 

      var optionSwitch = new Switch() { 
       HorizontalOptions = LayoutOptions.End, 
       VerticalOptions = LayoutOptions.Center, 
       IsVisible = false, 
      }; 
      optionSwitch.SetBinding (Switch.IsVisibleProperty, "IsSwitch"); 

      var statusLayout = new StackLayout { 
       Padding = new Thickness (10, 10, 10, 10), 
       Orientation = StackOrientation.Horizontal, 
       HorizontalOptions = LayoutOptions.FillAndExpand, 
       Children = { icon, textLayout, optionSwitch} 
      }; 
      statusLayout.SetBinding (StackLayout.HeightRequestProperty, "Height"); 

      var separatorBox = new BoxView { 
       HeightRequest = 1, 
       HorizontalOptions = LayoutOptions.FillAndExpand, 
       BackgroundColor = Color.FromRgb(.75,.75,.75), 
      }; 
      separatorBox.SetBinding (BoxView.HeightRequestProperty, "SeparatorHeight"); 

      var separatorBoxLayout = new StackLayout { 
       Padding = new Thickness (50, 0, 0, 0), 
       HorizontalOptions = LayoutOptions.FillAndExpand, 
       Children = { separatorBox } 
      }; 

      var cellLayout = new StackLayout { 
       Spacing = 0, 
       Padding = new Thickness (0, 0, 0, 0), 
       Orientation = StackOrientation.Vertical, 
       HorizontalOptions = LayoutOptions.FillAndExpand, 
       BackgroundColor = Color.White, 
       Opacity = 1.0, 
       Children = { statusLayout, separatorBoxLayout } 
      }; 
      cellLayout.SetBinding (StackLayout.OpacityProperty, "Opacity"); 

      var headerFrame = new ListViewLabel() { 

      }; 
      headerFrame.SetBinding (ListViewLabel.IsVisibleProperty, "IsLabel"); 
      headerFrame.SetBinding (ListViewLabel.TextProperty, "Name"); 
      headerFrame.SetBinding (ListViewLabel.HeightRequestProperty, "Height"); 

      headerFrame.PropertyChanged += (object sender, System.ComponentModel.PropertyChangedEventArgs e) => { 
       if(headerFrame.IsVisible) 
        cellLayout.IsVisible = false; 
       else 
        cellLayout.IsVisible = true; 
      }; 

      var paddedLayout = new StackLayout { 
       Spacing = 0, 
       Orientation = StackOrientation.Horizontal, 
       HorizontalOptions = LayoutOptions.FillAndExpand, 
       VerticalOptions = LayoutOptions.FillAndExpand, 
       Children = { headerFrame, cellLayout } 
      }; 

      this.SetBinding(IsEnabledProperty, "Enabled"); 
      this.View = paddedLayout; 

     } 

    } 

    public class GameCellData 
    { 

     public string Icon { get; set; } 

     public string IconPlaceholder { get; set; } 

     public string Name { get; set; } 

     public string Details { get; set; } 

     public int Height { get; set; } 

     public int SeparatorHeight { get; set; } 

     public bool Enabled { get; set; } 

     public double Opacity { get; set; } 

     public bool IsLabel { get; set; } 

     public bool IsSwitch { get; set; } 

    } 
} 
+0

Es stellte sich heraus, dass die Aktualisierung auf die neuesten Pakete den Absturz behoben hat! – Daniel

Antwort

0

Aktualisierung Es stellte sich heraus, um tagesaktuelle Pakete die Absturzfehler behoben.