c# - 为什么绑定(bind)不更新选择器选择的项目

标签 c# xamarin binding picker

我的 Xamarin 表单中有一个 Picker,绑定(bind)到一个模型(下面的代码)。

Load 方法设置了 SelectedVehicle 但选择器不显示所选车辆。首次加载页面时,选择器会在列表中显示正确的项目。但是在 App.VehicleId 更改后重新加载页面时,选择器显示空白。

即使我在 OnAppearing 期间在选取器上显式设置了 SelectedIndex,选取器也会显示空白,并且 SelectedIndex 已设置回 -1 以后再看。

如何在重新加载页面时正确更新选择器选择?

Xaml:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DefectReport"
             x:Class="DefectReport.MainPage">
    <ContentPage.Content>
        <ScrollView>
            <StackLayout>
                <Label x:Name="Message" TextColor="Red" />
                <Label Text="Welcome to Vehicle Check" />
                <Label Text="Choose vehicle" />
                <Picker ItemsSource="{Binding Vehicles}" ItemDisplayBinding="{Binding RegistrationNumber}" SelectedItem="{Binding SelectedVehicle}" SelectedIndexChanged="Picker_SelectedIndexChanged" />
                <Label Text="{Binding SelectedVehicle.Description}" />
                <Button Text="Add vehicle not in list" Clicked="SelectVehicle_Clicked" />
                <Button Text="Check vehicle" Clicked="CheckVehicle_Clicked" />
                <Button Text="Log out" Clicked="LogOut_Clicked" />
            </StackLayout>
        </ScrollView>
    </ContentPage.Content>
</ContentPage>

后面的代码是这样的:

public partial class MainPage : ContentPage {
    public class VehicleInfo : Model {
        public async void Load() {
            Vehicles = new ObservableCollection<Vehicle>(await App.Database.ReadAsync<Vehicle>().ToListAsync());
            SelectedVehicle = Vehicles.FirstOrDefault(v => v.DeviceRecordId == App.VehicleId) ?? Vehicles.FirstOrDefault();
            System.Diagnostics.Debug.WriteLine("App.VehicleId = " + App.VehicleId);
            System.Diagnostics.Debug.WriteLine("SelectedVehicle.Id = " + selectedVehicle.DeviceRecordId);
        }

        private Vehicle selectedVehicle;

        public Vehicle SelectedVehicle {
            get { return selectedVehicle; }
            set {
                if (selectedVehicle != value) {
                    selectedVehicle = value;
                    OnPropertyChanged("SelectedVehicle");
                }
            }
        }

        private ObservableCollection<Vehicle> vehicles;

        public ObservableCollection<Vehicle> Vehicles {
            get { return vehicles; }
            set {
                if (vehicles != value) {
                    vehicles = value;
                    OnPropertyChanged("Vehicles");
                }
            }
        }

    }
    VehicleInfo data;
    public MainPage() {
        data = new VehicleInfo();
        BindingContext = data;
        InitializeComponent();
    }

    protected override void OnAppearing() {
        base.OnAppearing();
        data.Load();
    }

Model 是实现 INotifyPropertyChanged 的简单类:

public class Model : System.ComponentModel.INotifyPropertyChanged {
    public void OnPropertyChanged(string name) {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

最佳答案

原来问题出在创建一个新的 ObservableCollection。我改了代码

Vehicles = new ObservableCollection<Vehicle>(await App.Database.ReadAsync<Vehicle>().ToListAsync());

而是清除现有集合,并向其中添加新记录。

关于c# - 为什么绑定(bind)不更新选择器选择的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46847280/

相关文章:

c# - 为 OPEN XML 中的单元格设置 Font.Bold 和 Column.Width

c# - 实际上什么是Nothing——它是如何转换的

android - Activity 终止后,BroadcastReceiver 不再被触发

objective-c - 为 BOOL 属性绑定(bind)到 NSMatrix

c# - WPF字体大小不变

c# 使用两个 MysqlReaders

c# - Xamarin .net 标准对 APK 大小的影响

vue.js - 无法将事件绑定(bind)到对象方法

android - 将本地服务绑定(bind)到 Activity 或使用广播接收器,哪个更有效?

c# - 从 C# 中的yield 返回 IEnumerable<T>