2015-07-27 3 views
0

Так у меня есть этот класс:ListView с DataTemplate - java.lang.reflect.InvocationTargetException

public class MenuItem 
{ 
    public string image { private set; get; } 

    public string text { private set; get; } 

    public MenuItem (string image, string text) 
    { 
     this.image = image; 
     this.text = text; 
    } 
} 

И следующий класс ViewCell:

public class MenuItemCell : ViewCell 
{ 
    public MenuItemCell() 
    { 
     Grid grid = new Grid 
     { 
      VerticalOptions = LayoutOptions.FillAndExpand, 
      RowDefinitions = 
      { 
       new RowDefinition { Height = new GridLength(100, GridUnitType.Auto) }, 
      }, 
      ColumnDefinitions = 
      { 
       new ColumnDefinition { Width = new GridLength(50, GridUnitType.Auto) }, 
       new ColumnDefinition { Width = new GridLength(100, GridUnitType.Auto) }, 
      } 
     }; 

     var menuImage = new Image 
     { 
      IsVisible = true, 
      Aspect = Aspect.AspectFit, 
     }; 

     var text = new Label { 
      TextColor = Color.Yellow, 
      BackgroundColor = Color.White, 
     }; 

     menuImage.SetBinding (ImageCell.ImageSourceProperty, "image"); 
     text.SetBinding (Label.TextProperty, "text"); 

     grid.Children.Add (menuImage, 0, 1, 0, 1); 
     grid.Children.Add (text, 1, 2, 0, 1); 

     this.View = grid; 
    } 

страница содержание заключается в следующем:

public class Navigation : ContentPage 
{ 
    ListView menu; 
    ProfileView profile; 
    DataTemplate viewTemplate; 
    List<MenuItem> items; 

    public Navigation() 
    { 
     profile = new ProfileView(); 

     items = new List<MenuItem> { 
      new MenuItem ("menuTradeIconBig.png", "TRADE"), 
      new MenuItem ("menuProfileIconBig.png", "PROFILE"), 
      new MenuItem ("menuPositionsIconBig.png", "POSITIONS"), 
     }; 

     menu = new ListView { RowHeight = 40 }; 
     menu.Header = profile; 
     var viewTemplate = new DataTemplate (typeof(MenuItemCell)); 
     menu.ItemTemplate = viewTemplate; 
     menu.ItemsSource = items; 

     Content = new StackLayout { 
      Children = {  
       menu 
      } 
     }; 
    } 

Проблема в том, что когда я нажимаю кнопку, которая отвечает за открытие страницы содержимого, я получаю

java.lang.reflect.InvocationTargetException

Если я Закомментируйте menu.ItemTemplate = viewTemplate;, страница загружается, но в списке все элементы имеют текст MyProjectName.MenuItem.

ответ

0

1 год спустя, я вернулся к этому вопросу и нашел эту проблему в течение 5 секунд:

Эта линия

menuImage.SetBinding (ImageCell.ImageSourceProperty, "image"); 

Должно быть, как это

menuImage.SetBinding (Image.ImageSourceProperty, "image"); 
0

Как вы не обеспечивают источник ProfileView или более полную трассировку исключения, можно только догадываться, но с именованием его, похоже, что вы устанавливаете View в menu.Header, в то время как оно должно быть вместо этого вид модель, например MenuItem, как вы не указали для нее HeaderTemplate.

Итак, во-первых, я хотел бы попробовать

menu.Header = new MenuItem ("foo.png", "HEADER"); 

Это, вероятно, не даст визуальный вы ожидаете, но это не должно врезаться больше. Затем вы настраиваете визуал для заголовка с помощью HeaderTemplate, назначая menu.Header объекту (еще не определенному) типа, например. HeaderItem

Вы получите больше информации по этому вопросу там http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/listview/#headerfooter

В любом случае, это может быть стоит сообщение о проблеме с http://bugzilla.xamarin.com. Даже если ваш код неверен из-за неправильной модели для шаблона, он не должен аварийно завершаться,

+0

Я попытался ваше предложение, но он по-прежнему падает с той же ошибкой. Я даже удалил заголовок целиком только для тестирования, и он по-прежнему падает. Я посмотрю в HeaderTemplate, но проблемы там нет. –

+0

делитесь более полной трассой –

0

Я думаю, это связано с тем, что вы пытаетесь заполнить GridView в элементе ListView Cell. Я не думаю, что это будет результат, который вы ищете. Вместо этого вы можете создать stackLayout в вашем MenuItemCell и установить его ориентацию на горизонтальный, и вы все равно можете достичь того же желаемого эффекта.

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

По моему мнению, я бы обернул весь код навигации внутри блока try/catch, а в качестве исключения использовал метод Debug.WriteLine() для вывода сообщения и трассировки стека таким образом, чтобы вы могли получить лучший дескриптор на ошибка.

Если в навигации нет ошибок, то можно предположить, что виновник находится в классе MenuItemCell, который вы можете повторить выше.

Надеюсь, это поможет.

Смежные вопросы