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



我有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中不使用代码。

最新更新