2016-12-01 8 views
6

次の問題があります。私の見解では、Listviewがあります。このリストビューには2つのボタンがあります。アイテムを編集するためのもの、削除するためのもの。ここでXamarinフォームのButtonコマンドのバインドをListView内で行います。

はXAML私のViewModelに

<ListView Grid.Row="1" x:Name="ArbeitsEinträgeList" ItemsSource="{Binding EintragList}" SelectedItem="{Binding SelectedItem}"> 
     <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
      <ViewCell.View> 
       <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition/> 
        <ColumnDefinition/> 
        <ColumnDefinition/> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 
       <Label Text="{Binding Titel}" TextColor="{Binding Fehlerhaft, Converter={StaticResource EintragartConverter}}"></Label> 
       <Label Grid.Column="1" Text="{Binding Beginn}" TextColor="{Binding BeginnManuell, Converter={StaticResource EintragartConverter}}"></Label> 
       <Label Grid.Column="2" Text="{Binding Ende}" TextColor="{Binding EndeManuell, Converter={StaticResource EintragartConverter}}"></Label> 
       <Button Grid.Column="3" Command="{Binding EditEintragCommand}" Text="&#xf040;" FontFamily="../Ressources/fontawesome.ttf#FontAwesome"></Button> 
       <Button Grid.Column="4" Command="{Binding DeleteEintragCommand}" Text="&#xF00D;" FontFamily="../Ressources/fontawesome.ttf#FontAwesome"></Button> 
       </Grid> 
      </ViewCell.View> 
      </ViewCell> 
     </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

の私のリストビューで、私はボタンではないリストビュー内のコマンドをテストしてきたし、それが完璧に動作しますが、私は必要なものがすべてです。私はバインディング、メッセージ上にカーソルを移動した場合

「のシンボルを解決できません 『...』」あなたはEintragList内の項目にバインドするためです

Cannot resolve symbol

答えて

17

月、

リストビューを使用しましたし、あなたのコマンドはDataTemplateの内部にあるので、結合はItemSourceの個々のモデルのバインディング・コンテキストに取り付けられています。

これを回避する方法は、次の操作を行いんです。

<ListView Grid.Row="1" x:Name="ArbeitsEinträgeList" ItemsSource="{Binding EintragList}" SelectedItem="{Binding SelectedItem}"> 
     <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
      <ViewCell.View> 
       <Grid x:Name="Item"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition/> 
        <ColumnDefinition/> 
        <ColumnDefinition/> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 
       <Label Text="{Binding Titel}" TextColor="{Binding Fehlerhaft, Converter={StaticResource EintragartConverter}}"></Label> 
       <Label Grid.Column="1" Text="{Binding Beginn}" TextColor="{Binding BeginnManuell, Converter={StaticResource EintragartConverter}}"></Label> 
       <Label Grid.Column="2" Text="{Binding Ende}" TextColor="{Binding EndeManuell, Converter={StaticResource EintragartConverter}}"></Label> 
       <Button Grid.Column="3" BindingContext="{Binding Source={x:Reference ArbeitsEinträgeList}, Path=BindingContext}" Command="{Binding EditEintragCommand}" CommandParameter="{Binding Source={x:Reference Item}, Path=BindingContext}" Text="&#xf040;" FontFamily="../Ressources/fontawesome.ttf#FontAwesome"></Button> 
       <Button Grid.Column="4" BindingContext="{Binding Source={x:Reference ArbeitsEinträgeList}, Path=BindingContext}" Command="{Binding DeleteEintragCommand}" CommandParameter="{Binding Source={x:Reference Item}, Path=BindingContext}" Text="&#xF00D;" FontFamily="../Ressources/fontawesome.ttf#FontAwesome"></Button> 
       </Grid> 
      </ViewCell.View> 
      </ViewCell> 
     </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

だからあなたはリストビューのバインディングコンテキストを参照するバインディングソースを設定する(つまり、あなたのビューモデルまたは「ArbeitsEinträgeListは、」あなたが設定することもできコマンドパラメータは各アイテムのバインディングコンテキストになります。わかりますように、x:Name = "Item"はグリッドにあり、CommandParameter = "{バインディングソース= {x:参照アイテム}、Path = BindingContext}"です。

このようなコマンドを宣言するだけで、ビューモデルで汎用コマンドを定義することができます。コマンドがparameteコマンドで実行されるとrは個々の項目の束縛文脈である。

public ICommand DeleteEintragCommand 
     { 
      get 
      { 
       return new Command((e) => 
        { 
         var item = (e as MyModelObject); 
         // delete logic on item 
        }); 
      } 
     } 
+1

ありがとうございました。あなたのソリューションは機能しています。 Thumbs up :) – JanMer

+0

'DataTemplate'が他のファイルから定義され、次のように取得されるとどうなりますか?' '? – mr5

6

表示されます - (あなたが結合理由ですプロパティをBeginnEndeのようなテキストプロパティに変換します)。そして、コマンドバインディングはあなたのリストから1つの項目のコマンドに到達しようとしますが、あなたのviewmodelからではありません。

オプション1:アイテムクラスにコマンドを設定し、そこでタップを処理します。

オプション2:あなたは、ソースがあなたのページ(およびない単一アイテム)であることを結合教える:あなたのページのルート要素の名前が設定されていることを、

Command="{Binding BindingContext.EditEintragCommand, Source={x:Reference Name=MyPageName}}" 

は、念のx:Name="MyPageName"

Additionaly

CommandParameter="{Binding .}" 

:Wコマンドを起動、あなたがオブジェクトとしてコマンドに送っても、その後でCommandParameterプロパティを設定できる項目、知っている

あなたはリストに項目を表示するために外部テンプレートを使用しています。something I described in another answer(同じ原則)を試すことができます。

関連する問題