C# 使用MVVM Xamarin表单用数据填充选择器
我正在尝试让选择器填充数据。在这个问题上似乎没有一个直接的答案。我尝试了很多方法,其中一个有效的方法是: Xaml: 在模型中: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"};
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());
}