首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当ViewModel SelectedItem中的值发生更改时,不会更新选取器Xamarin.Forms

当ViewModel SelectedItem中的值发生更改时,不会更新选取器Xamarin.Forms
EN

Stack Overflow用户
提问于 2019-05-24 00:15:36
回答 1查看 789关注 0票数 0

我有ViewModel,应该更新视图的用户界面控件根据数据从数据库。如果条目控件被正确更新,但即使参数更改了ViewModel中的值,我的选取器也不会获得更新的选择。

以下是来自View的Xaml的一些代码:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
    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分配一个对象,并相应地分配它的标题和类型。

当页面加载完成后,我的UI会更新标题,但是没有选择选择器中的类型,即使ViewModel中的值是正确的。Picker保持为-1 (尽管源项是正确的):

代码语言:javascript
复制
ObservableCollection<string> _featuredType;
    public ObservableCollection<string> FeaturedType
    {
        get => _featuredType;
        set
        {
            if (_featuredType != value)
            {
                _featuredType = value;
                NotifyPropertyChanged("FeaturedType");
            }
        }
    }

我在这里失去了理智,因为UWP中的ComboBox相当于工作没有问题,但我不得不搬到Xamarin,因为我正在成为安卓的依赖。

下面是我绑定到ViewModel的方式:

代码语言:javascript
复制
public PageViewModel ViewModel { get; set; }
BindingContext = this.ViewModel = new PageViewModel();

此外,我注意到在后台代码中进行一些测试,如下所示:

代码语言:javascript
复制
            string testType = ViewModel.Type;
            string testTitle = ViewModel.Title;

返回正确的Title值,但Type值结果为空,即使在ViewModel中也是正确的。

EN

回答 1

Stack Overflow用户

发布于 2019-05-24 02:12:07

好的,我找到了解决方案,但是我不确定为什么我之前的方案不起作用。

@Sparsha把我带到了正确的方向,基本上为了避免顺序问题,我从Xaml中填充了ItemsSource,而不是像这样用ViewModel编写代码:

代码语言:javascript
复制
<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中提供了哪些项目,这将不会有太大帮助。幸运的是,在这种情况下,我可以预先定义选择器项。然而,我想知道为什么它不能与viewmodel中的代码一起工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56279307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档