如何将 MAUI PIcker 绑定到 ViewModel?

dja*_*109 5 picker .net-maui

这是我的 .xaml

<Picker x:Name="Title" SelectedItem="{Binding Title, Mode=TwoWay}"  ItemsSource="{Binding Titles}" ItemDisplayBinding="{Binding Text}" Title="Title" />
<Entry x:Name="Name" Text="{Binding Name}" Placeholder="Name" />
Run Code Online (Sandbox Code Playgroud)

绑定到视图模型 .cs,如下所示

public class Person
{
    public string Name { get; set; }
    public string Title { get; set; }

    List<SelectListItem> Titles = new(){
        new SelectListItem { Text = "Mister", Value="Mr" }
        new SelectListItem { Text = "Doctor", Value="Dr" }
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

包含此数据

Person person = new() { Name = "Bill Jones", Title = "Mr" };
Run Code Online (Sandbox Code Playgroud)

所以选择器可以很好地显示列表。但我有两个问题。

  1. 如何让选择器在加载时显示正确的条目,在本例中,默认为Mr
  2. 如果我更改选择器中的值,如何获取绑定的 ViewModel 来处理该条目?(记住我想存储选定的值,而不是显示的值)。我知道它适用于简单的字符串列表,但这不是我想要的。

感觉就像我需要一处ItemValueBinding房产或类似的东西。(显然,这是我编造的)

我见过很多使用 INotifyPropertyChanged 的​​复杂代码,并在SelectedIndexChanged事件中做了一些巧妙的代码。但是,如果我的页面上有很多选择器,那么我就必须编写很多代码。

有没有一种我可能错过的更简单的方法来实现这两个要求?

Liq*_*SFT 3

如果你想设置选择器的默认值,你可以尝试这样:

Title.SelectedIndex = 0; // That means the picker chooses the first item. PickerIndex is 0-based
Run Code Online (Sandbox Code Playgroud)

在您的 ViewModel 中,更改 Title 属性

public string Title {get; set;}
Run Code Online (Sandbox Code Playgroud)

对此:

public SelectListItem Title {get; set;} // This will get selectedItem instead of just a Text
Run Code Online (Sandbox Code Playgroud)

您可以使用 BindingContext 将 Entry 与 Picker 绑定。这里我给大家举个例子:

<Picker x:Name="Title" SelectedItem="{Binding Title, Mode=TwoWay}" ItemsSource="{Binding Titles}" ItemDisplayBinding="{Binding Text}" Title="Title"/>
<Entry x:Name="Name"  BindingContext="{x:Reference Title}"  Text="{Binding SelectedItem.Text}" Placeholder="Name"/>
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,需要 x:Reference 标记扩展来引用源对象,即名为“Title”的 Picker。当选择器值更改时,它也会更改条​​目的文本。

有关更多信息,您可以参考基本绑定Picker