将选择器绑定到mvvm命令Xamarin表单

问题描述 投票:4回答:4

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

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

mvvm binding xamarin.forms command picker
4个回答
13
投票

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

首先我安装了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


1
投票

您需要做的就是监视视图模型中的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}" />

0
投票

我在这里找到了解决方案: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);
}

-2
投票

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

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

然后在你的代码后面添加你的indexChanged方法:

void indexChanged(object sender, EventArgs e) 
{
    //Your code here
}

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

© www.soinside.com 2019 - 2024. All rights reserved.