我一直在寻找尝试解决这个问题,我没有长时间使用Xamarin表格,但我认为这很容易。我试图将pickitem的picker绑定到视图模型中的命令,我使用的是FreshMVVM和Xamarin表单版本2.3.4.214-pre5,我能够绑定视图模型中的数据但是选择器中没有Command选项。
任何帮助,将不胜感激。谢谢
我已经能够得到一个有效的解决方案:
首先我安装了Xamarin Forms版本2.3.4.214-pre5,它运行得很好。然后在Xamarin论坛的帮助下,我获得了一个解决方案,如下所示:
1 - 通过在NuGet包管理器控制台中运行Behaviors.Forms
来安装Install-Package Behaviors.Forms
NuGet包。
2 - 然后在XAML页面中包含以下命名空间:
<ContentPage xmlns:behaviors="clr-namespace:Behaviors;assembly=Behaviors">
</ContentPage>
3 - 然后在Picker.Behaviors
标记中添加Picker
属性:
<Picker x:Name="MyPicker"
ItemsSource="{Binding IdentityProviders}"
HorizontalOptions="FillAndExpand" Title="Identity Provider"
Margin="10"
ItemDisplayBinding="{Binding Description}">
<Picker.Behaviors>
<behaviors:EventHandlerBehavior EventName="SelectedIndexChanged">
<behaviors:InvokeCommandAction Command="{Binding SelectedProviderChanged}" />
</behaviors:EventHandlerBehavior>
</Picker.Behaviors>
</Picker>
如果要将数据作为参数传回,请在命令CommandParameter="{Reference MyPicker}"
之后包含以下内容
这解决了我的问题,我希望这会有所帮助:我得到的帮助来自这个帖子MVVM Light - How to use the selectedIndexChanged event in viewModel
您需要做的就是监视视图模型中的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}" />
我在这里找到了解决方案:https://forums.xamarin.com/discussion/71084/call-command-programmatically-without-binding-to-button
在file.xaml中:
<Picker
SelectedIndexChanged="Handle_SelectedIndexChanged"
ItemsSource="{Binding FilterOptions}"
ItemDisplayBinding="{Binding Value}" />
在file.xaml.cs中:
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);
}
要在选择选择器项目时运行代码,请指定选择器的SelectedIndexChanged
属性:
<Picker x:Name="myPicker" SelectedIndexChanged="indexChanged"/>
然后在你的代码后面添加你的indexChanged
方法:
void indexChanged(object sender, EventArgs e)
{
//Your code here
}
然后,当用户从选择器中选择不同的项时,它将运行indexChanged方法。