带数据模板的列表视图 - java.lang.reflect.InvocationTargetException
ListView with DataTemplate - java.lang.reflect.InvocationTargetException
所以我有这个 class:
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 class:
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
。
由于您没有提供 ProfileView
的来源或更完整的异常跟踪,因此只能猜测,但从它的命名来看,您似乎正在将 View
设置为menu.Header
,而它应该是一个视图模型,例如 MenuItem
,因为您没有为其指定 HeaderTemplate
。
所以,首先,我会尝试
menu.Header = new MenuItem ("foo.png", "HEADER");
这可能不会提供您期望的视觉效果,但它应该不会再崩溃了。然后,您使用 HeaderTemplate
配置 header 的视觉效果,将 menu.Header
分配给类型的 object(尚未定义),例如HeaderItem
您将在此处获得有关该主题的更多信息http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/listview/#headerfooter
无论如何,将问题报告给 http://bugzilla.xamarin.com 可能是值得的。即使您的代码由于模板模型错误而导致错误,它也不应该崩溃,
我想是因为您试图将 GridView 填充到 ListView 项目单元格中。我认为那不会有您想要的结果。您可以做的是在 MenuItemCell 中创建一个 stackLayout 并将其方向设置为水平,您仍然可以达到相同的预期效果。
此外,当您收到这些消息时,通常会抛出一个异常,但它不会显示在您所说的那个弹出框中。因此,您需要查看应用程序输出以准确了解发生了什么。
在我看来,我会将整个导航代码包装在一个 try/catch 块中,并在异常情况下使用 Debug.WriteLine() 方法输出消息和堆栈跟踪,这样您就可以得到更好地处理错误。
如果导航中没有出现错误,那么可以安全地假设罪魁祸首在 MenuItemCell Class 中,您可以重复上面的相同过程。
希望对您有所帮助。
1年后,我回到这个问题,5秒发现问题:
这一行
menuImage.SetBinding (ImageCell.ImageSourceProperty, "image");
应该是这样的
menuImage.SetBinding (Image.ImageSourceProperty, "image");
所以我有这个 class:
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 class:
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
。
由于您没有提供 ProfileView
的来源或更完整的异常跟踪,因此只能猜测,但从它的命名来看,您似乎正在将 View
设置为menu.Header
,而它应该是一个视图模型,例如 MenuItem
,因为您没有为其指定 HeaderTemplate
。
所以,首先,我会尝试
menu.Header = new MenuItem ("foo.png", "HEADER");
这可能不会提供您期望的视觉效果,但它应该不会再崩溃了。然后,您使用 HeaderTemplate
配置 header 的视觉效果,将 menu.Header
分配给类型的 object(尚未定义),例如HeaderItem
您将在此处获得有关该主题的更多信息http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/listview/#headerfooter
无论如何,将问题报告给 http://bugzilla.xamarin.com 可能是值得的。即使您的代码由于模板模型错误而导致错误,它也不应该崩溃,
我想是因为您试图将 GridView 填充到 ListView 项目单元格中。我认为那不会有您想要的结果。您可以做的是在 MenuItemCell 中创建一个 stackLayout 并将其方向设置为水平,您仍然可以达到相同的预期效果。
此外,当您收到这些消息时,通常会抛出一个异常,但它不会显示在您所说的那个弹出框中。因此,您需要查看应用程序输出以准确了解发生了什么。
在我看来,我会将整个导航代码包装在一个 try/catch 块中,并在异常情况下使用 Debug.WriteLine() 方法输出消息和堆栈跟踪,这样您就可以得到更好地处理错误。
如果导航中没有出现错误,那么可以安全地假设罪魁祸首在 MenuItemCell Class 中,您可以重复上面的相同过程。
希望对您有所帮助。
1年后,我回到这个问题,5秒发现问题:
这一行
menuImage.SetBinding (ImageCell.ImageSourceProperty, "image");
应该是这样的
menuImage.SetBinding (Image.ImageSourceProperty, "image");