Xamarin表单选取器值绑定



绑定到选择器时,可以使用ItemDisplayBinding来绑定显示的值,但我看不到将每个项映射到选择值的方法。正因为如此,我不得不编写一些非常复杂的代码,以使我的拾取器与数据源的更改保持同步。

原始型号

// NOTE: this implements INPC, just abbreviated for clarity
public class DataModel
{
public ICollection<DataItem> Items;
pubilc DataItem SelectedItem;
}

原始选取器:

<Picker Title="Select Item..." 
ItemsSource="{Binding Items}"
ItemDisplayBinding="{Binding Name}"
SelectedItem="{Binding Path=SelectedItem}"></Picker>

新型

// NOTE: this implements INPC, just abbreviated for clarity
public class DataModel
{
public ICollection<DataItems> Items;
public ICollection<string> ItemNames;
public DataItem SelectedItem;
public string SelectedItemName;
public DataModel()
{
this.PropertyChanged += (s, e) => 
{
// I feel like I shouldn't have to do this...
if(StringComparer.Ordinal.Equals(e.PropertyName, nameof(Items)))
{
if(!String.IsNullOrWhitespace(this.SelectedItemName))
{
this.SelectedItem = this.Items.FirstOrDefault(x => StringComparer.Ordinal.Equals(x.Name, this.SelectedItemName));
if (this.SelectedItem == null) { this.SelectedItemName = null; }
}
}
}
}

新选取器:

<Picker Title="Select Item..."
ItemsSource="{Binding ItemNames}"
SelectedItem="{Binding Path=SelectedItemName}"></Picker>

我希望能够做这样的事情:

<Picker Title="Select Item..."
ItemsSource="{Binding Items}"
ItemDisplayBinding="{Binding Name}"
ItemValueBinding="{Binding Name}"
SelectedItem="{Binding Path=SelectedItemName}"></Picker>

我不需要对该项的引用,我需要它的一个属性。这样,当Items集合更改时,如果它仍然存在,它会自动重新选择正确的项。我发现我正在到处添加第二个集合,其中只有我想要选择的属性,并进行所有这些映射。我在其他平台上工作过,这都很直接,所以我觉得我一定错过了Xamarin.Forms.

我认为您不需要这样做。SelectedItem属性数据绑定到连接视图模型的SelectedItem(在原始模型中(属性,该属性的类型为DataItem。因此,当用户在选取器中选择项目时,SelectedItem属性将自动设置为选定的DataItem对象。

你可以在它的SelectedIndexChanged事件中测试它,比如:

<Picker Title="Select Item..." 
ItemsSource="{Binding Items}"
ItemDisplayBinding="{Binding Name}"
SelectedItem="{Binding Path=SelectedItem}"
SelectedIndexChanged="Picker_SelectedIndexChanged">
</Picker>
private void Picker_SelectedIndexChanged(object sender, EventArgs e)
{
Picker picker = sender as Picker;
DataItem dt = picker.SelectedItem as DataItem ;
Console.WriteLine(dt.Name); // you will see when you select a item,the SelectedItem will be changed automatically
}

我建议你使用ObservableCollection<Item> Items,这样当它改变时,它会自动更新你的Items

最新更新