私はこの問題を解決するためにどこでも探していました。Xamarinフォームを長い間使用していませんでしたが、簡単だったと思いました。ピッカーselecteditemchangedをビューモデルのコマンドにバインドしようとしています。FreshMVVMおよびXamarinフォームバージョン2.3.4.214-pre5を使用しています。ビューモデルからデータをバインドできますが、ピッカーにコマンドオプションがありません。 。
どんな助けでもいただければ幸いです。ありがとうございました
私は実用的な解決策を得ることができました:
まず、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
タグに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イベントを使用する方法
ビューモデルの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メソッドが実行されます。