2016-06-22 46 views
0

我有一個Xamarin表單列表視圖的應用程序,該列表由ObservableCollection提供,用於列出從我的服務器獲取的用戶遊戲。我第一次加載它就能很好地工作。如果我以任何方式修改現有的ObservableCollection,我的應用程序會崩潰並出現NullException。我已經縮小到我的自定義ViewCell(GameCell),我已經在下面發佈了。如果我評論了一條線向底部:ListView在使用我的自定義單元格重新加載時崩潰

this.SetBinding(IsEnabledProperty, "Enabled"); 

然後,它不再崩潰更新的ObservableCollection,但後來我不再獲得的功能,以啓用一些細胞和禁用一些細胞。我猜測它試圖將isEnabled屬性設置爲不再存在的單元格,因爲它在重新加載時已被刪除。任何想法如何做到這一點與崩潰?順便說一句,這工作正常在Android上,只是沒有在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

原來更新到最新的軟件包修復了崩潰! – Daniel

回答

0

原來更新到最新的軟件包固定的崩潰。

相關問題