Xamarin.android 如何绑定到Spinner.SelectedItem

Xamarin.android 如何绑定到Spinner.SelectedItem,xamarin.android,reactiveui,Xamarin.android,Reactiveui,我想将微调器中的选定文本绑定到ViewModel中名为SelectedRole的字符串。这就是我所做的 this.Bind(ViewModel, vm => vm.SelectedRole, v => v.roleSpinner.SelectedItem.ToString()); 然而,我遇到了一个例外 System.NotSupportedException: Index expressions are only supported with constants. Spinne

我想将微调器中的选定文本绑定到ViewModel中名为SelectedRole的字符串。这就是我所做的

this.Bind(ViewModel, vm => vm.SelectedRole, v => v.roleSpinner.SelectedItem.ToString());
然而,我遇到了一个例外

System.NotSupportedException: Index expressions are only supported with constants.
Spinner的SelectedItem属性具有只读访问权限,没有setter,因此绑定无法工作,因为它是双向的

另一种方法是安装ReactiveUI.Events包并使用ItemSelected observable,如下所示:

_spinner.Events().ItemSelected
    .Select(_ => _spinner.SelectedItem.ToString())
    .BindTo(ViewModel, x => x.Selected);
当然,视图模型属性是被动的:

private string _selected;
public string Selected
{
    get => _selected;
    set => this.RaiseAndSetIfChanged(ref _selected, value);
}
如果要初始化微调器值,请使用SetSelection方法:


我在我的手机上测试了所有这些,它的工作原理与预期相符。让我知道此功能是否适合您的需要。

您必须将ToString用作转换参数,而不是实际绑定的一部分。由于Bind是双向的,它将要求您同时进行vm-v转换和v-vm转换。类似这样的东西:BindViewModel,vm=>vm.SelectedRole,v=>v.roleSpinner.SelectedItem,x=>x.ToString,[string-to-item-conversion];检查以确保您需要双向绑定,如果单向绑定对您有效,它将简化此问题。@ColtBauman:我不这么认为,它仍然会给我相同的例外。我怀疑由于roleSpinner的SelectedItem属性是Java.Lang.Object,而ReactiveUI不支持这种类型。
_spinner.SetSelection(2);