当ViewModel Xamarin.Forms中的值更改时,Picker SelectedItem不会更新

时间:2019-05-23 16:15:36

标签: xamarin.forms binding viewmodel selecteditem picker

我有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中是正确的。

1 个答案:

答案 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中的代码。