web-dev-qa-db-ja.com

ピッカーをmvvmコマンドXamarinフォームにバインドする

私はこの問題を解決するためにどこでも探していました。Xamarinフォームを長い間使用していませんでしたが、簡単だったと思いました。ピッカーselecteditemchangedをビューモデルのコマンドにバインドしようとしています。FreshMVVMおよびXamarinフォームバージョン2.3.4.214-pre5を使用しています。ビューモデルからデータをバインドできますが、ピッカーにコマンドオプションがありません。 。

どんな助けでもいただければ幸いです。ありがとうございました

6
theshwaguy

私は実用的な解決策を得ることができました:

まず、Xamarin Formsバージョン2.3.4.214-pre5をインストールしましたが、問題なく動作しています。次に、Xamarinフォーラムの助けを借りて、次のような解決策が与えられました。

1-NuGetパッケージマネージャーコンソールでBehaviors.Formsを実行して、Install-Package Behaviors.FormsNuGetパッケージをインストールします。

2-次に、XAMLページに次の名前空間を含めます。

<ContentPage xmlns:behaviors="clr-namespace:Behaviors;Assembly=Behaviors">
</ContentPage>

3-次に、PickerタグにPicker.Behaviors属性を追加します。

<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-viewModelでselectedIndexChangedイベントを使用する方法

15
theshwaguy

ビューモデルの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}" />
1
Nick Turner

私はここで解決策を見つけました: 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);
}
0
K. Tola

ピッカーアイテムが選択されたときにコードを実行するには、ピッカーのSelectedIndexChangedプロパティを指定します。

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

次に、コードビハインドにindexChangedメソッドを追加します。

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

次に、ユーザーがピッカーから別のアイテムを選択すると、indexChangedメソッドが実行されます。

0
cvanbeek