2016-12-01 15 views
6

Mam następujący problem, moim zdaniem Mam Listview. W tym liście chciałbym mieć dwa przyciski. Jeden do edycji przedmiotu, drugi do usunięcia.Wiązanie polecenia przycisku Xamarin Forms wewnątrz ListView

Oto mój ListView w XAML

<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> 

W moim ViewModel jest wszystko, czego potrzebuję, ja testowałem polecenia z przycisku nie w ListView i działa idealnie.

Gdybym najedź wiążącego się komunikat „Nie można rozwiązać symbol«...»” pojawia

Cannot resolve symbol

Odpowiedz

17

Jan,

Ponieważ używałem widoku listy i twoje polecenia są wewnątrz DataTemplate, wiązania jest przymocowany do kontekście wiążącej każdego modelu w ItemSource.

Sposób wokół to robią, co następuje:.

<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> 

Więc ustawić źródło wiązania odwoływać kontekst wiązania widoku listy (czyli model widok lub „ArbeitsEinträgeList” Można również ustawić parametr command jest kontekstem powiązania każdego pojedynczego elementu. Jak widzisz, mam x: Name = "Item" na siatce i CommandParameter = "{Binding Source = {x: Reference Item}, Path = BindingContext}".

Po prostu, deklarowanie takich poleceń pozwala na zdefiniowanie ogólnego polecenia w modelu widoku i wykonanie polecenia za pomocą parametru komendy r jest wiążącym kontekstem pojedynczej pozycji.

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

Dziękuję bardzo. Twoje rozwiązanie działa. Kciuki w górę :) – JanMer

+0

Co zrobić, jeśli 'DataTemplate' jest zdefiniowany z innego pliku i pobrany w ten sposób:' '? – mr5

6

To dlatego, że wiążą się z elementu w EintragList - nieruchomości (dlatego swój wiążący do właściwości tekstowych, takich jak praca Beginn i Ende). Powiązanie poleceń próbuje osiągnąć polecenie w jednym elemencie z listy, a nie w widoku.

Opcja 1: Ustawiasz komendę w swojej klasie pozycji i obsługujesz dotknięcie tam.

Opcja 2: Powiedz wiążący że źródłem powinny być strona (a nie pojedynczy element):

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

Wystarczy upewnić się, że nazwa stronach korzeni elementu jest ustawiony x:Name="MyPageName"

aby dowiedzieć się, który element pożary polecenia, można ustawić właściwość CommandParameter, który następnie również przesłać do polecenia jako obiekt:

CommandParameter="{Binding .}" 

Dodatkowo: w Jeśli używasz zewnętrznych szablonów do pokazania elementów na liście, możesz spróbować something I described in another answer (ta sama zasada).

Powiązane problemy