2017-12-21 48 views
0

注:これはXamarinフォーム用です。重複と思われる質問は、実際にC#ListViewを扱うことです。Xamarinフォームリストビュー:リスト項目にコマンドを追加

私はリストビューを持っています(Mac Xamarinフォーム用のVisual Studio 2017を使用するクロスプラットフォーム)私はデータバインディングを大まかに理解していますので、 Webサービスからデータをロードする。今度は、表示された行ごとにいくつかのアクションを実行して、各アイテムのListViewにボタンを埋め込みました。私は選択された行に対して何らかの機能を実行するようにアクションを追加する方法を知ることができません。私が作成したリストビューボタンで

この方法:私の背後にあるコードで

<Button x:Name="prayUpButton" Command="{Binding _handle_prayupbutton_action}" Text="PU" Grid.Row="4" Grid.Column="0" /> 

は、次の方法があります:私の理解から

void handle_prayupbutton_action() 
{ 

} 

public Command _handle_prayupbutton_action 
{  
     get { return new Command(() => handle_prayupbutton_action()); 
} 

をあなたがしてトリガするCommandを作成アクション。私はここで何が欠けていますか?私がvoid handle_prayupbutton_action()にブレークポイントを置くと決してそれに当たらない。

Xamarin Formsクロスプラットフォームのリストビューにアクションを追加するには、ベストプラクティス/正しい方法は何ですか?

UPDATE 1:私はこれに以下のコードを変更:

これは私のヘッダーです:

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
x:Class="prayupapp.Pages.PrayersPage" x:Name="PrayersPagePage"> 

だから私はボタンコマンドを変更:

<Button x:Name="prayUpButton" Command="{Binding Source={x:Static local.PrayersPagePage._handle_prayupbutton_action}}" Text="Pray Up" Grid.Row="4" Grid.Column="0" /> 

私も作っJulipanのコマンドルーチンa Staticが提案した。リストビューが前のページからロードを停止したので、私は実際に回帰しています。私はボタンのコマンドを元のコードに戻すと(それは明らかに間違っている)、動作することがわかります。私がバインディングをやっているやり方に何か問題があります。

+0

[ListViewでレコードを選択してコードビハインドメソッドで参照するにはどうすればよいですか?](https://stackoverflow.com/questions/47823693/how-can-i-select-a-record -in-a-listview-and-the-code-behind-meth) –

+1

コードの背後にあるときは、Xaml.csファイルを参照していますか?バインディングを使用するには、ビューのBindingContextを別のクラス(ViewModel)に設定し、そこにコマンドを配置する必要があります。 https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/はほとんどをカバーしています –

+1

バインドコンテキストをListViewまたはPageに設定しましたか? ItemのBindingContextは項目そのものです。したがって、アイテムセル内でバインディングを使用する場合は、アイテムレベルでバインディングプロパティにアクセスできる必要があります。わかりますか? –

答えて

0

すべてを行う必要があるの背後にあるコードをバインドするために、あなたは「背後にあるコード」に静的なコマンドを定義する必要があなたのボタンのCommandプロパティにコマンドのされている場合:

static void handle_prayupbutton_action() 
{ 

} 

public static Command _handle_prayupbutton_action 
{ 
    get 
    { 
     return new Command(() => handle_prayupbutton_action()); 
    } 
} 

そして、あなたのXAMLあなたの中にバインドするソースを追加する必要があります。

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
     xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
     xmlns:local="clr-namespace:AppX" 
     x:Class="AppX.MainPage"> 

    <StackLayout> 
     <ListView ItemsSource="{Binding Source={x:Static local:MainPage.Items}, 
             Path=.}"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <ViewCell> 
         <StackLayout> 
          <Button Text="{Binding .}" 
            Command="{Binding Source={x:Static local:MainPage._handle_prayupbutton_action}}"/> 
         </StackLayout> 
        </ViewCell> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackLayout> 
</ContentPage> 

これは私の側では完全に機能しています。私はあなたが探している知識を得ることを願っています。

+0

新しいコードで質問を更新しました。それでも私のために働いていない:( – logixologist

+1

注意! "Source"を "local"に設定していますが、この変数はXAMLで定義されていません(例ではコマンドが存在する名前空間を参照しています)。 「コードビハインド」でイベントを処理する場合は、代わりに「クリック」を使用してくださいMVVMアーキテクチャを使用する場合はコマンドが適しています 「クリック」を選択する場合は、Commandingを忘れてバインディングが必要ない

+0

私はあなたが私の問題を解決したと思う...最終的にクリックイベントを投げることができる。なぜ私はそれを過去に働かせることができなかったのか分からないただいくつかのことを試す必要がある。 ! – logixologist

関連する問題