C# 使用MVVM Xamarin表单用数据填充选择器

C# 使用MVVM Xamarin表单用数据填充选择器,c#,xaml,xamarin,mvvm,C#,Xaml,Xamarin,Mvvm,我正在尝试让选择器填充数据。在这个问题上似乎没有一个直接的答案。我尝试了很多方法,其中一个有效的方法是: Xaml: 在模型中: public async Task<List<string>> GetDriverNames() { await Sleep(); List<string> _drivers = new List<string> { "Steve"};

我正在尝试让选择器填充数据。在这个问题上似乎没有一个直接的答案。我尝试了很多方法,其中一个有效的方法是:

Xaml:

在模型中:

 public async Task<List<string>> GetDriverNames()
        {
            await Sleep();

            List<string> _drivers = new List<string> { "Steve"};

            return _drivers;          

        }
公共异步任务GetDriverNames() { 等待睡眠(); 列表_drivers=新列表{“Steve”}; 返回驱动程序; } 这不起作用,但当运行调试时,它显示驱动程序已填充。
我已经浪费了很多时间试图完成这项工作,有人有见解吗?

您将需要一个
可观察的集合
,可能还需要一个
INotifyPropertyChanged
接口实现来通知视图任何更改

public class YourViewModel: INotifyPropertyChanged
{
     public YourViewModel()
     { 
         Drivers = new ObservableCollection<string>();
     }

     private ObservableCollection<string> _drivers;
     public ObservableCollection<string> Drivers
     {
         get { return _drivers; }
         set
         {
            if (Equals(value, _drivers)) return;
            _drivers= value;
            OnPropertyChanged(nameof(Drivers));
         }
     }

     protected virtual void OnPropertyChanged(string propertyName)
     {
         PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
     }
}
对于其他
绑定的
属性,您仍然需要
OnPropertyChanged
事件


请参阅和

而不是列表使用ObservableCollection。我会尝试一下,您可能应该使用Drivers。AddRange(…)而不是assignment…@RomanAnanyev:如果您正在更新:-),请在更新之前调用
Clear
),这是针对视图模型还是模型?这又是如何访问模型中的数据的?对不起,我是新来的。对不起,我的错,这是视图模型。您通过
BindingContext=new YourViewModel()绑定到视图的那一个。
谢谢!还有,这是如何访问模型类中的数据的?我问,因为稍后这将从服务中获取名称,还是像以前一样调用GetDriverNames方法?
 <Picker Grid.Row="2"
           Grid.Column="0"
           Grid.ColumnSpan="4"
           Title="Driver Name"
            ItemsSource="{Binding Drivers}"                
            SelectedItem="{Binding driverID}"
            />
public List<string> Drivers;
 public async Task FindDriverNames()
    {
        Drivers = await GetDriverNames();           
    }
 public async Task<List<string>> GetDriverNames()
        {
            await Sleep();

            List<string> _drivers = new List<string> { "Steve"};

            return _drivers;          

        }
public class YourViewModel: INotifyPropertyChanged
{
     public YourViewModel()
     { 
         Drivers = new ObservableCollection<string>();
     }

     private ObservableCollection<string> _drivers;
     public ObservableCollection<string> Drivers
     {
         get { return _drivers; }
         set
         {
            if (Equals(value, _drivers)) return;
            _drivers= value;
            OnPropertyChanged(nameof(Drivers));
         }
     }

     protected virtual void OnPropertyChanged(string propertyName)
     {
         PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
     }
}
public async Task FindDriverNames()
{
    Drivers.Clear();
    Drivers.AddRange(await GetDriverNames());           
}