使用MVVM Xamarin Forms填充数据选择器

时间:2017-06-14 11:19:33

标签: c# xaml xamarin mvvm

我想让一个选择器填充数据。在这方面似乎没有直接的答案。我尝试了很多东西,有一件事可行:

的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;          

        }

这不起作用,但在运行调试时会显示已填充驱动程序。 我浪费了很多时间来尝试这项工作,有没有人有见解?

1 个答案:

答案 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个事件。

请参阅ObservableCollection<T>INotifyPropertyChanged