将选择器绑定到mvvm命令Xamarin forms

将选择器绑定到mvvm命令Xamarin forms,mvvm,binding,xamarin.forms,command,picker,Mvvm,Binding,Xamarin.forms,Command,Picker,我一直在到处寻找,试图解决这个问题,我没有使用Xamarin表单很长时间,但我认为这会很容易。 我正在尝试将选择器selecteditemchanged绑定到视图模型中的命令,我正在使用FreshMVVM和Xamarin forms版本2.3.4.214-pre5,我能够绑定视图模型中的数据,但选择器中没有命令选项 任何帮助都将不胜感激。 谢谢要在选择选取器项目时运行代码,请指定选取器的SelectedIndexChanged属性: <Picker x:Name="myPicker" Se

我一直在到处寻找,试图解决这个问题,我没有使用Xamarin表单很长时间,但我认为这会很容易。 我正在尝试将选择器selecteditemchanged绑定到视图模型中的命令,我正在使用FreshMVVM和Xamarin forms版本2.3.4.214-pre5,我能够绑定视图模型中的数据,但选择器中没有命令选项

任何帮助都将不胜感激。
谢谢

要在选择选取器项目时运行代码,请指定选取器的
SelectedIndexChanged
属性:

<Picker x:Name="myPicker" SelectedIndexChanged="indexChanged"/>

然后,当用户从选择器中选择不同的项时,它将运行indexChanged方法。

我已经能够得到一个有效的解决方案:

首先,我安装了Xamarin Forms版本2.3.4.214-pre5,它工作正常。 然后在Xamarin论坛的帮助下,我得到了一个解决方案,如下所示:

1-通过在NuGet package manager控制台中运行
Install package Behaviors.Forms
来安装
Behaviors.Forms
NuGet软件包

2-然后在XAML页面中包含以下命名空间:

<ContentPage xmlns:behaviors="clr-namespace:Behaviors;assembly=Behaviors">
</ContentPage>
如果要将数据作为参数传回,请在命令
CommandParameter=“{Reference MyPicker}”

这解决了我的问题,我希望这有助于:
我得到的帮助来自这篇文章

我在这里找到了解决方案:

在file.xaml中:

<Picker
       SelectedIndexChanged="Handle_SelectedIndexChanged"
       ItemsSource="{Binding FilterOptions}"
       ItemDisplayBinding="{Binding Value}" />
在视图模型中:

public ICommand ChangeOptionCommand { get; private set; }

public TransactionViewModel()
{
    ChangeOptionCommand = new Command<KeyValuePair<string, string>>(ChangeOption);
}

void ChangeOption(KeyValuePair<string, string> selectedOption)
{
    Debug.WriteLine(selectedOption);
}
public ICommand ChangeOptionCommand{get;private set;}
公共事务视图模型()
{
ChangeOptionCommand=新命令(ChangeOption);
}
无效更改选项(KeyValuePair Selected选项)
{
Debug.WriteLine(选择选项);
}

只需监视视图模型中的SelectedItem属性

        private ObservableRangeCollection<UserViewModel> _users = new ObservableRangeCollection<UserViewModel>();
        public ObservableRangeCollection<UserViewModel> Users
        {
            get => _users;
            set { _users = value; OnPropertyChanged(); }
        }

    private User _selectedUser;
        public UserModelView CurrentUser
        {
            get => _selectedUser;
            set { _selectedUser = value; 
                  //Do Some stuff with your new user(); 
                  OnPropertyChanged(); 
}
        }



<Picker WidthRequest="100" 
                ItemsSource="{Binding Users}"
                ItemDisplayBinding="{Binding Name}"
                SelectedItem="{Binding CurrentUser, Mode=TwoWay}" />
private observeRangeCollection\u users=new observeRangeCollection();
公共ObserverAgeCollection用户
{
get=>\u用户;
设置{u users=value;OnPropertyChanged();}
}
私人用户_selectedUser;
公共用户模型视图当前用户
{
get=>\您选择的用户;
设置{u selectedUser=value;
//对你的新用户做一些事情();
OnPropertyChanged();
}
}

我认为当您选择一个值时,SelectedItem属性会发生变化。您正在搜索哪个命令?这会起作用,但我正在尝试将其绑定到mvvm命令,在进行选择时更新模型。我需要把它绑定到命令上。在“使用ViewModels命令”部分下,显示了支持命令界面的视图<代码>选取器不是其中之一,因此如果您必须使用
命令
选取器
对您无效。这是一个很好的技巧。我相信它应该很容易移植到任何类型的控制。谢谢分享!然后,选择器将绑定到错误的ViewModel。只需在视图模型中监视属性感谢您提供了非常全面的答案在我看来,这似乎是更干净、更纯粹的MVVM替代方案。此选项看起来不错,但在我看来,@NickTurner提出的答案似乎是更好的选择。
TransactionViewModel ViewModel { get => BindingContext as TransactionViewModel; set => BindingContext = value; }

void Handle_SelectedIndexChanged(object sender, System.EventArgs e)
{
    var selectedOption = (sender as Picker).SelectedItem;
    ViewModel.ChangeOptionCommand.Execute(selectedOption);
}
public ICommand ChangeOptionCommand { get; private set; }

public TransactionViewModel()
{
    ChangeOptionCommand = new Command<KeyValuePair<string, string>>(ChangeOption);
}

void ChangeOption(KeyValuePair<string, string> selectedOption)
{
    Debug.WriteLine(selectedOption);
}
        private ObservableRangeCollection<UserViewModel> _users = new ObservableRangeCollection<UserViewModel>();
        public ObservableRangeCollection<UserViewModel> Users
        {
            get => _users;
            set { _users = value; OnPropertyChanged(); }
        }

    private User _selectedUser;
        public UserModelView CurrentUser
        {
            get => _selectedUser;
            set { _selectedUser = value; 
                  //Do Some stuff with your new user(); 
                  OnPropertyChanged(); 
}
        }



<Picker WidthRequest="100" 
                ItemsSource="{Binding Users}"
                ItemDisplayBinding="{Binding Name}"
                SelectedItem="{Binding CurrentUser, Mode=TwoWay}" />