在Xamarin xaml中导致此例外的原因是什么?

时间:2018-04-14 21:18:31

标签: c# xaml xamarin

我一直在研究UWP应用程序已有一段时间了。我们最近决定转换到Xamarin,以便我们可以轻松支持Android和UWP。设置PCL以用于我们的代码库时,我没有遇到任何问题。现在我在尝试重写Xamarin.Forms的UI时遇到了一些噩梦。我正在努力完成一些相对简单的事情,我必须做一些搞笑的事情,但是,我无法弄清楚是什么。

我想显示一个listView。这是XAML:

<ContentPage.Content>
    <StackLayout>
        <Label Text="This is the bill page."
            VerticalOptions="CenterAndExpand" 
            HorizontalOptions="CenterAndExpand" />
        <ListView x:Name="lvBills" 
                  ItemsSource="{Binding Bills}" 
                  SelectedItem="{Binding SelectedBill}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackLayout Orientation="Horizontal">
                        <Label Text="{Binding Amount}"
                               TextColor="White"
                               VerticalOptions="CenterAndExpand" 
                               HorizontalOptions="CenterAndExpand"/>
                        <Label Text="{Binding DueDate}"
                               VerticalOptions="CenterAndExpand" 
                               HorizontalOptions="CenterAndExpand"
                               TextColor="White"/>
                    </StackLayout>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage.Content>

当我运行它时,listView会填充我的observable集合中的每个项目。但是,实际上没有显示任何文本..即使我删除了绑定并使用了一些占位符文本。此外,如果我单击listView中的任何项目,此异常会使程序崩溃。

System.InvalidCastException: Unable to cast object of type 
'Xamarin.Forms.StackLayout' to type 'Xamarin.Forms.Cell'.
at Xamarin.Forms.Internals.TemplatedItemsList`2.ActivateContent(Int32 index, 
Object item)
at Xamarin.Forms.Internals.TemplatedItemsList`2.CreateContent(Int32 index, O 
Object item, Boolean insert)
at Xamarin.Forms.Internals.TemplatedItemsList`2.GetOrCreateContent(Int32 
index, Object item)
at Xamarin.Forms.Internals.TemplatedItemsList`2.get_Item(Int32 index)
at Xamarin.Forms.L

我无法弄清楚任何产生任何有意义结果的搜索。我尝试过其他一些东西:在xaml中为ItemSelected添加绑定。我试图在xaml.cs中连接代表但是我无法取得任何进展。那么,我做错了什么?

1 个答案:

答案 0 :(得分:5)

ViewCell内需要DataTemplate

<ContentPage.Content>
    <StackLayout>
        <Label Text="This is the bill page."
            VerticalOptions="CenterAndExpand" 
            HorizontalOptions="CenterAndExpand" />
        <ListView x:Name="lvBills" 
                  ItemsSource="{Binding Bills}" 
                  SelectedItem="{Binding SelectedBill}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell> <!-- <----- Add this -->
                        <StackLayout Orientation="Horizontal">
                            <Label Text="{Binding Amount}"
                                   TextColor="White"
                                   VerticalOptions="CenterAndExpand" 
                                   HorizontalOptions="CenterAndExpand"/>
                            <Label Text="{Binding DueDate}"
                                   VerticalOptions="CenterAndExpand" 
                                   HorizontalOptions="CenterAndExpand"
                                   TextColor="White"/>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage.Content>