xamarin 选择器 SelectedItem 在可观察集合上返回 null
xamarin picker SelectedItem returning null on observable collection
在我的 xamarin 项目中,选取器绑定中的 SelectedItem 不工作。当我将 ItemSource 设置为列表时,SelectedItem 起作用,但是当我将 ItemSource 更改为 ObservableCollection 时,SelectedItem 总是 returns 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();
}
}
}
我刚刚在您的 other question here 中解释了相同的内容。
根据我从您的代码中看到的情况,SelectedItem
似乎是问题所在。
由于您的 Picker
的 ItemsSource
(TestList 属性) 是 List<Performance>
类型,SelectedItem
属性 绑定到 Picker
必须是 Performance
类型。但是,在您的情况下,您将其保留为 string
而不是 Performance
。
ItemDisplayBinding
必须是 Performance
object 中任何 属性 的名称,在你的情况下没问题,因为你有一个字符串 属性在你的 Performance
class 中调用了 ShortDesc
。
这就是我在您的代码中看到的问题。像下面这样更改 属性 ShortDesc
的类型,并将 collection TestList
中的任何一项分配给它。您的代码将开始正常工作。
private Performance _shortDesc;
public Performance ShortDesc
{
get { return _shortDesc; }
set
{
{
_shortDesc = value;
NotifyPropertyChanged();
}
}
}
Refer to the documentation here which explains a clear example for Binding objects to Picker.
希望对您有所帮助。
在我的 xamarin 项目中,选取器绑定中的 SelectedItem 不工作。当我将 ItemSource 设置为列表时,SelectedItem 起作用,但是当我将 ItemSource 更改为 ObservableCollection 时,SelectedItem 总是 returns 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();
}
}
}
我刚刚在您的 other question here 中解释了相同的内容。
根据我从您的代码中看到的情况,SelectedItem
似乎是问题所在。
由于您的 Picker
的 ItemsSource
(TestList 属性) 是 List<Performance>
类型,SelectedItem
属性 绑定到 Picker
必须是 Performance
类型。但是,在您的情况下,您将其保留为 string
而不是 Performance
。
ItemDisplayBinding
必须是 Performance
object 中任何 属性 的名称,在你的情况下没问题,因为你有一个字符串 属性在你的 Performance
class 中调用了 ShortDesc
。
这就是我在您的代码中看到的问题。像下面这样更改 属性 ShortDesc
的类型,并将 collection TestList
中的任何一项分配给它。您的代码将开始正常工作。
private Performance _shortDesc;
public Performance ShortDesc
{
get { return _shortDesc; }
set
{
{
_shortDesc = value;
NotifyPropertyChanged();
}
}
}
Refer to the documentation here which explains a clear example for Binding objects to Picker.
希望对您有所帮助。