我有ViewModel,应该根据DB的数据来更新视图的UI控件。这是为了正确更新输入控件的情况,但是即使参数更改ViewModel中的值,我的选择器也不会更新。
。这是视图的XAML:
中的一些代码<Entry x:Name="TitleBox" Grid.Row="0" HorizontalOptions="FillAndExpand" Placeholder="Title" Text="{Binding Title, Mode=TwoWay}"/>
<Picker x:Name="TypeCombo" Title="Type" Grid.Row="2" SelectedItem="{Binding Type, Mode=TwoWay}" ItemsSource="{Binding FeaturedType}"/>
和ViewModel:
public string Title
{
get => _Version.Title;
set
{
if (_Version.Title != value)
{
_Version.Title = value;
NotifyPropertyChanged("Title");
}
}
}
public string Type
{
get => _Version.Type;
set
{
if (_Version.Type != value)
{
_Version.Type = value;
NotifyPropertyChanged("Type");
}
}
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
在ViewModel中的某些时刻,_version是从DB分配的,并且正在相应地分配其标题和类型。
当页面完成加载时,我的UI获取标题更新,但是即使在ViewModel中值正确,也未选择Picker的类型。选择器保持在-1(源项目是正确的(:
ObservableCollection<string> _featuredType;
public ObservableCollection<string> FeaturedType
{
get => _featuredType;
set
{
if (_featuredType != value)
{
_featuredType = value;
NotifyPropertyChanged("FeaturedType");
}
}
}
我在这里失去了头部,因为UWP中的组合曲线效果没有问题,但是当我成为Android依赖时,我不得不搬到Xamarin。
这就是我绑定到ViewModel的方式:
public PageViewModel ViewModel { get; set; }
BindingContext = this.ViewModel = new PageViewModel();
另外,我注意到这样的代码进行了一些测试:
string testType = ViewModel.Type;
string testTitle = ViewModel.Title;
返回正确的标题值,但是类型值结果即使在ViewModel中也是正确的。
好吧,我找到了解决方案,但是我不确定为什么我以前的人不起作用。
@sparsha bhattarai使我朝着正确的方向,基本上是为了避免订单问题,我从XAML中填充了XAML而不是代码,而不是在ViewModel中:
<Picker.ItemsSource>
<x:Array Type="{x:Type x:String}">
<x:String>Type1</x:String>
<x:String>Type2</x:String>
<x:String>Type3</x:String>
</x:Array>
</Picker.ItemsSource>
这已经解决了我的问题,选择器从ViewModel获得了正确的SelectedItem。
但是,如果我不知道这些物品可用的东西,这将没有太大帮助。幸运的是,在这种特殊情况下,我可以事先定义采摘物品。但是,我想知道为什么它在ViewModel中不使用代码。