我有ViewModel应该根据来自数据库的数据更新View的UI控件。发生这种情况的原因是,Entry控件已正确更新,但是即使参数更改了ViewModel中的值,我的选择器也无法获得更新的Selection。
这是View的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中分配了一个对象,并且相应地分配了其Title和Type。
页面加载完成后,我的UI会更新标题,但是即使ViewModel中的值正确,也不会选择Picker中的Type。选择器仍为-1(尽管源项目正确):
ObservableCollection<string> _featuredType;
public ObservableCollection<string> FeaturedType
{
get => _featuredType;
set
{
if (_featuredType != value)
{
_featuredType = value;
NotifyPropertyChanged("FeaturedType");
}
}
}
我在这里失去了头绪,因为UWP中的ComboBox可以正常工作,但是随着我成为Android的依赖者,我不得不搬到Xamarin。
这是我绑定到ViewModel的方式:
public PageViewModel ViewModel { get; set; }
BindingContext = this.ViewModel = new PageViewModel();
此外,我注意到在代码后面进行了一些测试,如下所示:
string testType = ViewModel.Type;
string testTitle = ViewModel.Title;
返回正确的Title值,但Type值返回Null,即使在ViewModel中是正确的。
答案 0 :(得分:0)
好的,我找到了解决方案,但是我不确定为什么我的上一个不起作用。
@Sparsha Bhattarai使我朝着正确的方向发展,基本上是为了避免订单问题,我从Xaml中填充了ItemsSource,而不是像这样在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。
但是,如果我不知道Source中提供了哪些Item,那么这将无济于事。幸运的是,在这种情况下,我可以预先定义选择器项目。但是,我想知道为什么它不适用于viewmodel中的代码。