我想让一个选择器填充数据。在这方面似乎没有直接的答案。我尝试了很多东西,有一件事可行:
的Xaml:
<Picker Grid.Row="2"
Grid.Column="0"
Grid.ColumnSpan="4"
Title="Driver Name"
ItemsSource="{Binding Drivers}"
SelectedItem="{Binding driverID}"
并在视图模型中:
List<string> Drivers = new List<string> { "Steve","Dave" };
这很好用,但它只是一个虚拟功能,因为将来这些名称将从某种服务中获取。 因此,为了复制这个,我尝试将此列表分成一个模拟服务,然后将列表返回到视图模型并使其以这种方式工作。
但即使我在调试时看到列表不是空白,这仍然没有返回前端。 然后我尝试创建一个Driver类并返回其中包含名称的类的实例,并在Xaml中访问它。 这不起作用,我甚至尝试使用IList的变体,这也没有用。
我不确定为什么这不起作用,因为列表只是分开到基本上不同的类。例如,这就是我现在正在尝试的事情:
的Xaml:
<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;
}
这不起作用,但在运行调试时会显示已填充驱动程序。 我浪费了很多时间来尝试这项工作,有没有人有见解?
答案 0 :(得分:1)
您需要一个ObservableCollection
,可能还需要一个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));
}
}
通过实现INotifyPropertyChanged
接口,只要整个列表发生变化,您就可以更新视图。如果项目已添加到集合中,则可观察集合将通知UI。
如Roman所述,在这种特定情况下,您也可以使用可观察集合来更新ui
。
public async Task FindDriverNames()
{
Drivers.Clear();
Drivers.AddRange(await GetDriverNames());
}
对于其他bound
属性,您仍需要OnPropertyChanged
个事件。