【问题标题】:ListView Not showing anything about observable collection data bindingListView 没有显示任何关于可观察集合数据绑定的信息
【发布时间】:2020-01-03 12:45:43
【问题描述】:

在视图中,我有一个 ListView,它应该显示一个带有 Observable 字符串集合的数据绑定,但没有显示任何内容

如果我放了一个标签而不是 listview 并且可观察的集合将它变成一个简单的字符串,我会看到数据

在主视图中:

<ListView Grid.Row="1" Grid.Column="1" ItemsSource="{Binding SerialsPorts}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextCell Text="{Binding SerialPortName}"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

在主视图模型中

 class BrightnessSerialsPortsViewModel : INotifyPropertyChanged, IBrightnessSerialsPortsViewModel
    {

        //readonly IPageDialogService pageDialogService;
        readonly IBrightnessSerialsPortsManager manager;

        public BrightnessSerialsPortsViewModel()
        {
            //pageDialogService = new PageDialogService();

            manager = new BrightnessSerialsPortsManager();

            manager.BrightnessInfoUpdated += OnBrightnessInfoUpdated;
            manager.DeviceSerialPortsInfoUpdated += OnDeviceSerialsPortsInfoUpdated;

            PageAppearingCommand = new Command(OnPageAppearing);
            PageDisappearingCommand = new Command(OnPageDisappearing);
        }

        void OnPageAppearing()
        {
            //pageDialogService.DisplayAlert("Invoke Command Demo Page", "Appearing event fired.", "OK");
            manager.GetBrightness();
            manager.GetSerialsPorts();
        }

        void OnPageDisappearing()
        {
            //pageDialogService.DisplayAlert("Invoke Command Demo Page", "Disappearing event fired.", "OK");
            SerialTest = "";
        }


        private void OnDeviceSerialsPortsInfoUpdated(object sender, IDeviceSerialsPortsInfoEventArgs e)
        {
          foreach(string device in e.DeviceSerialsPorts.Devices)
            {
                ISerialsPortsViewModel serialsPortsViewModel = new SerialsPortsViewModel(device);
                SerialsPorts.Add(serialsPortsViewModel);

                SerialTest += device + Environment.NewLine;
            }
        }

        private void OnBrightnessInfoUpdated(object sender, IBrightnessInfoEventArgs e)
        {
            float f = e.DeviceBrightness.Brightness;
            decimal dec = new decimal(f);
            Brightness = (double) dec;
        }

        //public ICommand ChangeBrightnessCommand { get; set; }

        public ICommand PageAppearingCommand { get; private set; }

        public ICommand PageDisappearingCommand { get; private set; }

        public ICommand ChangeBrightnessCommand => new RelayCommand(() => ExcecuteChangeBrightnessCommand());

        public void ExcecuteChangeBrightnessCommand()
        {

        }

        private ObservableCollection<ISerialsPortsViewModel> serialsPorts = new ObservableCollection<ISerialsPortsViewModel>();

        public ObservableCollection<ISerialsPortsViewModel> SerialsPorts { get=> serialsPorts ; set { serialsPorts = value; OnPropertyChanged(nameof(SerialsPorts)); } }

        private string serialstest = "";

        public string SerialTest { get => serialstest; set {serialstest = value ; OnPropertyChanged(nameof(SerialTest)); } }

        private double brightness = 1.0;

        public double Brightness { get => brightness; set {brightness = value ; OnPropertyChanged(nameof(Brightness)); } }


        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

在 SerialPorts 视图模型中:

 public SerialsPortsViewModel(string serialPortName)
        {
            SerialPortName = serialPortName;
        }

        private string serialPortName;

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        public string SerialPortName { get=> serialPortName; set {serialPortName = value ; OnPropertyChanged(nameof(SerialPortName)); } }

我做错了什么?

【问题讨论】:

  • 你设置BindingContext了吗?
  • 是的,如果我用一个简单的标签替换 ListView 并用一个简单的字符串替换 observable 集合,就会出现数据
  • 为什么我认为您将接口集合绑定到视图?
  • 使用断点我看到可观察的集合有价值,只是在视图中什么都看不到
  • 检查模型的名称是SerialsPortsViewModelISerialsPortsViewModel

标签: c# listview xamarin.forms data-binding observablecollection


【解决方案1】:

已解决将视图更改为:

<ListView Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" ItemsSource="{Binding SerialsPorts}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell Height="60">
                            <StackLayout Orientation="Horizontal">
                                <BoxView BackgroundColor="Blue" WidthRequest="10" Margin="0,0,0,10" />
                                <StackLayout BackgroundColor="White" Orientation="Vertical" Margin="5,5,10,5">
                                    <Label Text="{Binding SerialPortName}" FontAttributes="Bold" />
                                </StackLayout>
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2021-12-15
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多