【问题标题】:xamarin picker SelectedItem returning null on observable collectionxamarin 选择器 SelectedItem 在可观察集合上返回 null
【发布时间】:2020-02-06 18:25:29
【问题描述】:

在我的 xamarin 项目中,选择器绑定中,SelectedItem 不起作用。当我将 ItemSource 设置为 List 时,SelectedItem 可以工作,但是当我将 ItemSource 更改为 ObservableCollection 时,SelectedItem 总是返回 null。有人能看出我做错了吗?

在加载视图时,选择器通过数据绑定填充。然后在一个按钮事件上,我尝试抓取 SelectedItem....,这就是它返回为 null 的时候。

xaml

        <Picker x:Name="PickerMarket2" Title="Market2" ClassId="PickerMarket2"
                ItemsSource="{Binding TestList2}"
                ItemDisplayBinding="{Binding ShortDesc}"
                SelectedItem="{Binding SelectedMarket}"
                Grid.Row="0" Grid.Column="1" >
        </Picker>

查看模型

    class VamiMarketViewModel: INotifyPropertyChanged
{
    private List<string> _testList;
    public List<string> TestList
    {
        get { return _testList; }
        set
        {
            {
                _testList = value;
                NotifyPropertyChanged();
            }
        }
    }

    private ObservableCollection<Performance> _testList2;
    public ObservableCollection<Performance> TestList2
    {
        get { return _testList2; }
        set
        {
            {
                _testList2 = value;
                NotifyPropertyChanged();
            }
        }
    }

    private string _selectedMarket;
    public string SelectedMarket
    {
        get { return _selectedMarket; }
        set
        {
            {
                _selectedMarket = value;
                NotifyPropertyChanged();
            }
        }
    }

【问题讨论】:

  • 这个确切的问题刚刚在您之前的问题中向您解释过。您的 ItemSource 是 List 但您的 SelectedItem 是字符串。

标签: xamarin data-binding picker


【解决方案1】:

我刚刚在您的other question here 中解释了相同的内容。

我从您的代码中看到,SelectedItem 似乎是问题所在。 由于您的PickerItemsSource(TestList 属性)属于List&lt;Performance&gt; 类型,因此绑定到PickerSelectedItem 属性必须属于Performance 类型。但是,在您的情况下,您将其保留为 string 而不是 Performance

ItemDisplayBinding 必须是您的 Performance 对象内的任何属性的名称,在您的情况下这很好,因为您的 Performance 类中有一个名为 ShortDesc 的字符串属性。

这就是我在您的代码中看到的问题。更改属性ShortDesc 的类型,如下所示,并将您的集合TestList 中的任何一项分配给它。您的代码将开始正常工作。

private Performance _shortDesc;
public Performance ShortDesc
{
   get { return _shortDesc; } 
   set
   {
       {
            _shortDesc = value;
            NotifyPropertyChanged();
       }
   }
}

请参阅documentation here,其中解释了将对象绑定到 Picker 的清晰示例。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 2011-01-05
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多