ListView with DataTemplate - java.lang.reflect.InvocationTargetException

时间:2015-07-27 06:32:33

标签: c# android-listview xamarin datatemplate xamarin.forms

所以我有这个课程:

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

3 个答案:

答案 0 :(得分:0)

由于您没有提供ProfileView的来源或更完整的异常跟踪,因此您只能猜测,但从命名来看,您似乎正在设置View到{{ 1}},而它应该是一个视图模型,如menu.Header,因为你没有为它指定MenuItem

所以,首先,我试试

HeaderTemplate

这可能不会给你想象的视觉效果,但它不应该再崩溃了。然后,您可以使用menu.Header = new MenuItem ("foo.png", "HEADER"); 为标头配置视觉效果,将HeaderTemplate分配给类型的对象(尚未定义),例如menu.Header

您可以在http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/listview/#headerfooter

获得有关该主题的更多信息

无论如何,将问题报告给http://bugzilla.xamarin.com可能是值得的。即使您的代码由于模板的错误模型而不正确,也不应该崩溃,

答案 1 :(得分:0)

我在想是因为你试图将GridView填充到ListView项目Cell中。我不认为那会有你想要的结果。您可以做的是在MenuItemCell中创建一个stackLayout并将其方向设置为Horizo​​ntal,您仍然可以达到相同的效果。

此外,当您收到这些消息时,通常会抛出异常,但它不会显示在您所说的弹出框中。因此,您需要查看应用程序输出以确切了解发生的情况。

在我看来,我会将整个导航代码包装在try / catch块中,并在异常时使用Debug.WriteLine()方法输出消息和堆栈跟踪,以便您可以更好地处理错误

如果导航中没有抛出错误,那么可以安全地假设罪魁祸首在MenuItemCell类中,您可以重复上述相同的过程。

我希望这会有所帮助。

答案 2 :(得分:0)

1年后,我回到了这个问题,并在5秒内发现了问题:

这一行

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

应该是这样的

{{1}}