ViewCellのTappedイベントがジェネリック関数にパラメーターを送信し、そのViewCell要素のピッカーを開くようにするにはどうすればよいですか?

サマンサJTスター

更新:念のために言っておきますが、誰かがジェスチャーを使用せずにこの機能を実装する方法を教えてくれれば、これには500ポイントのボーナスがあります>

ViewCellとジェスチャレコグナイザーを使用して、次のコードでピッカーを開きます。ViewCellの左側にはラベルがあり、右側にはラベル領域があります。この領域には、アプリの起動時に最初に入力され、後でViewCellがクリックされたときにピッカーが表示されます。

XAML

<ViewCell x:Name="ati" Tapped="OpenPickerCommand">
   <Grid VerticalOptions="CenterAndExpand" Padding="20, 0">
      <Grid.GestureRecognizers>
         <TapGestureRecognizer 
             Command="{Binding OpenPickerCommand}" 
             CommandParameter="{x:Reference atiPicker}" NumberOfTapsRequired="1" />
      </Grid.GestureRecognizers>
      <local:LabelBodyRendererClass Text="Answer Time Interval" HorizontalOptions="StartAndExpand" />
      <Picker x:Name="atiPicker" IsVisible="false" HorizontalOptions="End" SelectedIndexChanged="atiPickerSelectedIndexChanged" ItemsSource="{Binding Times}"></Picker>
      <local:LabelBodyRendererClass x:Name="atiLabel" HorizontalOptions="End"/>
   </Grid>
</ViewCell>

<ViewCell x:Name="pti" Tapped="OpenPickerCommand">
   <Grid VerticalOptions="CenterAndExpand" Padding="20, 0">
      <Grid.GestureRecognizers>
         <TapGestureRecognizer 
             Command="{Binding OpenPickerCommand}" 
             CommandParameter="{x:Reference ptiPicker}" NumberOfTapsRequired="1" />
      </Grid.GestureRecognizers>
      <local:LabelBodyRendererClass Text="Phrase Time Interval" HorizontalOptions="StartAndExpand" />
      <Picker x:Name="ptiPicker" IsVisible="false" HorizontalOptions="End" SelectedIndexChanged="ptiPickerSelectedIndexChanged" ItemsSource="{Binding Times}"></Picker>
      <local:LabelBodyRendererClass x:Name="ptiLabel" HorizontalOptions="End"/>
   </Grid>
</ViewCell>

C#これは、CommandParameterを使用してさまざまなピッカー(ati、bti、ptiなど)で機能します

public SettingsPage()
{
   InitializeComponent();
   BindingContext = new CommandViewModel();
}

void atiPickerSelectedIndexChanged(object sender, EventArgs e)
    {
        var picker = (Picker)sender;
        int selectedIndex = picker.SelectedIndex;
        if (selectedIndex != -1)
        {
            App.DB.UpdateIntSetting(Settings.Ati, selectedIndex);
            atiLabel.Text = AS.ati.Text();
        }
    }

void ptiPickerSelectedIndexChanged(object sender, EventArgs e)
    {
        var picker = (Picker)sender;
        int selectedIndex = picker.SelectedIndex;
        if (selectedIndex != -1)
        {
            App.DB.UpdateIntSetting(Settings.Pti, selectedIndex);
            ptiLabel.Text = AS.pti.Text();
        }
    }


public class CommandViewModel: ObservableProperty
{
    public ICommand openPickerCommand;

    public CommandViewModel()
    {
        openPickerCommand = new Command<Picker>(PickerFocus);
        //openPickerCommand = new Command(tapped);
    }

    public ICommand OpenPickerCommand
    {
        get { return openPickerCommand; }
    }

    void PickerFocus(Picker param)
    {
        param.Focus();
    }
}

TapGestureRecognizersの使用を削除したいのですが、それでも機能とレイアウトを維持したいと思います。

ViewCellのTappedイベントを次のように使用した方がよいと私に提案されました。

 Tapped="OnTapped"

誰かがこれをC#で接続する方法を詳細に説明できますか?CommandViewModelとC#バッキングコードに何かをコーディングするのが最善でしょうか。また、ビューモデルには、さまざまなピッカーを開くために使用できるように、引数を取る1つのメソッドを含めることができますか?

私がこれを行う方法の例をいただければ幸いです。.csバッキングコードだけでコーディングすることでこれを実行できる方法がある場合は、CommandViewModelを特に使用する必要がないことに注意してください。

ディエゴラファエルソウザ

(英語が下手でごめんなさい)

ベストプラクティスではありませんが、ビューモデルを却下して、次のようなことができると思います。

XAML:

<ViewCell x:Name="ati" Tapped="OpenPickerCommand">
   <Grid VerticalOptions="CenterAndExpand" Padding="20, 0">
      <local:LabelBodyRendererClass Text="Answer Time Interval" HorizontalOptions="StartAndExpand" />
      <Picker x:Name="atiPicker" 
              IsVisible="false" 
              HorizontalOptions="End" 
              SelectedIndexChanged="atiPickerSelectedIndexChanged" 
              ItemsSource="{Binding Times}">
      </Picker>
      <local:LabelBodyRendererClass x:Name="atiLabel" HorizontalOptions="End"/>
   </Grid>
</ViewCell>

<ViewCell x:Name="pti" Tapped="OpenPickerCommand">
   <Grid VerticalOptions="CenterAndExpand" Padding="20, 0">
      <local:LabelBodyRendererClass Text="Phrase Time Interval" HorizontalOptions="StartAndExpand" />
      <Picker x:Name="ptiPicker" IsVisible="false" HorizontalOptions="End" SelectedIndexChanged="ptiPickerSelectedIndexChanged" ItemsSource="{Binding Times}"></Picker>
      <local:LabelBodyRendererClass x:Name="ptiLabel" HorizontalOptions="End"/>
   </Grid>
</ViewCell>

C#:

private void OpenPickerCommand(object sender, System.EventArgs e)
{
    if (sender != null)
    {
        Picker pkr = sender == ati ? atiPicker : ptiPicker;
        pkr.Focus();
    }
}

「ビューモデルに引数を取るメソッドを1つ含めることはできますか?」という質問に答えると、それはまさに「OpenPickerCommand」メソッドを使用してすでに行っていることです。問題は、ViewCellのパブリックイベント「Tapped」を使用すると、デリゲートハンドラーにパラメーターを設定できないことです。

それがあなたのために働くかどうか、またはあなたがいくつかのより多くの情報を必要とするかどうか私に知らせてください。

お役に立てば幸いです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ