如何修复ListView不显示绑定到其ItemSource的ObservableCollecton的内容

时间:2019-09-07 19:57:11

标签: c# xaml listview xamarin mvvm

我在Xamarin.Forms应用程序中使用MVVM模式。我正在尝试用一张包含简单信息的卡片列表来填充我的页面。为此,我使用的是ObservableCollection(CardsCollectionViewModel.cs)和存储在集合中的类(CardViewModel)的对象。

初始化Collection,并将其传递给MainPage.xaml.cs类。在MainPage.xaml中,集合名称绑定到ListView ItemSource,存储对象的属性绑定到list的内容。

程序启动并成功加载Cards集合后,页面似乎空白。

此处的完整项目:https://github.com/InfroLab/barkot/tree/master/Barkot

这是我的卡类: CardViewModel.cs

    public class CardViewModel : INotifyPropertyChanged
    {
        //some code
        public CardViewModel(int id, string company, string barcode, string type, string site)
        {
            //some code
        }

        private int id;
        private string company = "";
        private string barcode = "";
        private string type = "";
        private string site = "";

        public int Id { get; set; }
        public string Company
        {
            get { return company; }
            set
            {
                //Console.WriteLine("{0}", Company);
                if (company != value)
                {
                    company = value;
                    OnPropertyChanged("Company");
                }
            }
        }
        public string Barcode
        {
            get { return barcode; }
            set
            {
                if (barcode != value)
                {
                    barcode = value;
                    OnPropertyChanged("Barcode");
                }
            }
        }
        public string Type
        {
            get { return type; }
            set
            {
                if (type != value)
                {
                    type = value;
                    OnPropertyChanged("Type");
                }
            }
        }
        public string Site
        {
            get { return site; }
            set
            {
                if (site != value)
                {
                    site = value;
                    OnPropertyChanged("Site");
                }
            }
        }
    }

这是我的收藏课: CarCollectionViewModel.cs

public class CardCollectionViewModel : INotifyPropertyChanged
    {
        public static ObservableCollection<CardViewModel> Cards { get; set; }
        //some code
        public static void UpdateCards()
        {
            //gettingitems from local db
            Cards = App.Database.GetItems();
        }
        public CardCollectionViewModel()
        {
            Cards = new ObservableCollection<CardViewModel>();
            UpdateCards();
            //some code
        }
    }

这是MainPage.xaml中的ListView:

<ListView SeparatorVisibility="None" HasUnevenRows="True" ItemsSource="{Binding Cards}" SelectionMode="None">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <ViewCell.View>
                            <Frame Margin="10" HeightRequest="148" Padding="10" CornerRadius="5" HasShadow="True" BackgroundColor="#FFFFFF" InputTransparent="False" >
                                <StackLayout Orientation="Vertical">
                                    <Button Text="Edit" Command="{Binding EditCardCommand}" BackgroundColor="#EBEBEB" HeightRequest="20" HorizontalOptions="End"/>
                                    <StackLayout Orientation="Horizontal">
                                        <WebView Source="{Binding Site}" HeightRequest="128" WidthRequest="128" VerticalOptions="FillAndExpand"/>
                                        <StackLayout Spacing="5" Orientation="Vertical">
                                            <Label Text="{Binding Company}" FontSize="Small" TextColor="#232323" />
                                            <Label Text="{Binding Barcode}" FontSize="Small" TextColor="#232323" />
                                            <forms:ZXingBarcodeImageView  BarcodeFormat="{Binding Type}" BarcodeValue="{Binding Barcode}" HeightRequest="40" WidthRequest="200">
                                                <zx:ZXingBarcodeImageView.BarcodeOptions>
                                                    <zxcm:EncodingOptions Width="200" Height="40" PureBarcode="True"/>
                                                </zx:ZXingBarcodeImageView.BarcodeOptions>
                                            </forms:ZXingBarcodeImageView>
                                        </StackLayout>
                                    </StackLayout>
                                </StackLayout>
                            </Frame>
                            </ViewCell.View>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

我希望在页面上看到一个已加载列表,但其实际内容为空。

解决方案:

        private ObservableCollection<CardViewModel> cards = new ObservableCollection<CardViewModel>();
        public ObservableCollection<CardViewModel> Cards
        {
            get
            {
                return cards;
            }
            set
            {
                if (cards != value)
                {
                    cards = value;
                    OnPropertyChanged("Cards");
                }
            }
        }

1 个答案:

答案 0 :(得分:0)

更新Cards

Cards = App.Database.GetItems();

您没有引发PropertyChanged事件,因为您使用的是卡片的默认吸气剂