【发布时间】:2019-10-10 06:27:54
【问题描述】:
我有 ViewModel,它应该根据 DB 中的数据更新 View 的 UI 控件。这发生在 Entry 控件被正确更新但我的 Pickers 没有得到更新的 Selection 时,即使 ViewModel 中的参数改变了值..
这是来自 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 的类型。 Picker 保持在 -1(虽然源项是正确的):
ObservableCollection<string> _featuredType;
public ObservableCollection<string> FeaturedType
{
get => _featuredType;
set
{
if (_featuredType != value)
{
_featuredType = value;
NotifyPropertyChanged("FeaturedType");
}
}
}
我在这里迷失了方向,因为 UWP 中的 ComboBox 等效项可以正常工作,但我不得不转向 Xamarin,因为我越来越依赖 Android。
这就是我绑定到 ViewModel 的方式:
public PageViewModel ViewModel { get; set; }
BindingContext = this.ViewModel = new PageViewModel();
另外,我注意到在后面的代码中做一些测试是这样的:
string testType = ViewModel.Type;
string testTitle = ViewModel.Title;
返回正确的 Title 值,但 Type 值导致 Null,即使在 ViewModel 中它是正确的。
【问题讨论】:
-
您的选择器项目何时加载?在设置 Type 属性之前还是之后?
-
你的意思是ItemsSource?在设置类型和标题之前填充列表。
-
您是否尝试设置 ItemDisplayBinding?另外,是否所有项目都已加载,唯一的问题是当前项目选择?
-
是的,除了选择器之外,一切都完美加载。我没有尝试 itemdisplaybinding 虽然
-
ItemDisplayBinding 应该是什么?
标签: xamarin.forms binding viewmodel selecteditem picker