在Xamarin中使用ListView显示静态社交媒体时间轴帖子

时间:2017-05-02 11:23:34

标签: listview xamarin

我希望显示社交媒体时间线帖子as shown in this image这是我的ListView代码,目前由于某些错误没有显示任何内容。

<StackLayout>

<ListView x:Name="LvTimeLine">
<ListView.ItemTemplate>

  <DataTemplate>
    <ViewCell>

      <Grid>

        <Grid.RowDefinitions>
              <RowDefinition Height="0.15" />
              <RowDefinition Height="0.35" />
              <RowDefinition Height="0.20" />
              <RowDefinition Height="0.10" />
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.15" />
            <ColumnDefinition Width="0.25" />
            <ColumnDefinition Width="0.20" />
            <ColumnDefinition Width="0.50" />
        </Grid.ColumnDefinitions>

      <BoxView Grid.Row="0" Grid.Column="0">

      <Image x:Name="Imagedp" Source="{Binding ProfilePic}" HeightRequest="70" WidthRequest="70" />

      </BoxView>

      <BoxView Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="3">

       <Label Text="{Binding ProfileName}" />

      </BoxView>

      <BoxView Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="4">

              <!--post image-->
          <Image x:Name="ImagePostImage" Source="{Binding PostImage}" HeightRequest="250" />

      </BoxView>

      <BoxView Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="4">

              <!--Details-->
          <Label Text="{Binding PostDesc}" />


      </BoxView>


      <BoxView Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="3">

              <!--Category-->
          <Label Text="{Binding PostCat}" />


      </BoxView>

      <BoxView Grid.Row="3" Grid.Column="3">

              <!--Like button-->
          <Label Text="Like - Comment - Share" />


      </BoxView>




      </Grid>


    </ViewCell>
  </DataTemplate>

</ListView.ItemTemplate>  
</ListView>


</StackLayout>

这是我的ListList.cs类,我在listview中绑定了它。

    public class PostList
{
    public int Id { get; set; }

    public string ProfilePic { get; set; }
    public string ProfileName { get; set; }
    public string PostImage { get; set; }

    public string PostDesc { get; set; }
    public string PostCat { get; set; }

}

此外,我已在我的列表视图中声明了3条记录

    public TabActiveForms()
    {
        InitializeComponent();
        LvTimeLine.ItemsSource = new List<PostList>
        {
            new PostList() { Id=1, ProfileName = "Uzair", ProfilePic = "D1.jpg", PostCat = "Sports", PostDesc = "Lahore Stadium", PostImage = "P1.jpg"},
            new PostList() { Id=2, ProfileName = "Tasmeer", ProfilePic = "D2.jpg", PostCat = "Sports", PostDesc = "Karachi Stadium", PostImage = "P2.jpg"},
            new PostList() { Id=3, ProfileName = "Aamna", ProfilePic = "D3.jpg", PostCat = "Home", PostDesc = "Talagang Stadium", PostImage = "P3.JPG"},
        };

    }

2 个答案:

答案 0 :(得分:0)

首先,您应该使用ObservableCollection<PostList>代替List<PostList>

其次,您的模型应该实现INotifyPropertyChanged。

我建议将PropertyChanged.Fody用于INPC

答案 1 :(得分:0)

对于静态(如问题标题中所述)listview集合,没有严格要求使用ObservableCollection。只要内容是静态的,使用普通Listarray就可以了。 ObservableCollection确保您的ListView在收集更改时收到通知。 INotifyPropertyChanged界面可确保您的ViewCell可以响应对象本身的更改。请参阅ListView ItemsSource上的Xamarin文档。

List更改为ObservableCollection对您的案例不会有太大帮助,因为您提供的代码中存在其他一些基本问题。

  1. 行和列定义很可能不是您想要的,您的定义会导致非常小的网格。 Xamarin使用*Auto或绝对值。有关详细信息,请参阅the documentation
  2. BoxViews不添加任何内容,它们可能是您没有看到任何内容的原因。 BoxView不支持子元素,因为它不是ContentView,而是常规View
  3. 您应该将HasUnevenRows的{​​{1}}属性设置为true,或者设置适合您想要的大小的固定单元格高度。
  4. 由于我无法解释的一些奇怪的原因,我不得不重写ListView方法让Bindings工作。
  5. 虽然ToString()可能无法解决您的问题,但值得了解其工作原理,并使用ObservableCollection界面。我也可以推荐基于Fody的INotifyPropertyChanged包,就像亚历山德罗所说的那样。