【问题标题】:Picker SelectedItem is not being updated when value changes in ViewModel Xamarin.Forms当 ViewModel Xamarin.Forms 中的值更改时,选择器 SelectedItem 未更新
【发布时间】: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


【解决方案1】:

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

@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>

这解决了我的问题,并且 Pickers 正在从 ViewModel 获取正确的 SelectedItem。

但是,如果我不知道 Source 中可用的项目是什么,这将无济于事。幸运的是,在这种特殊情况下,我可以预先定义选择器项目。但是,我想知道为什么它不适用于 viewmodel 中的代码。

【讨论】:

  • 您的 ViewModel 是否继承了 INotifyPropertyChanged 接口?我有一个类似的问题,发现我没有继承它。
猜你喜欢
  • 2018-12-20
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多