2016-12-01 35 views
6

Tôi có vấn đề sau, theo quan điểm của tôi, tôi có một Listview. Trong listview này tôi muốn có hai nút. Một để chỉnh sửa mục, một để xóa nó.Xamarin Forms Button Command ràng buộc bên trong một ListView

Đây là listview của tôi trong 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> 

Trong ViewModel của tôi là tất cả những gì tôi cần, tôi đã thử nghiệm các lệnh với một nút không trong listview và nó hoạt động hoàn hảo.

Nếu tôi di chuột qua liên kết, thông báo "Không thể giải quyết biểu tượng '...'" xuất hiện

Cannot resolve symbol

Trả lời

17

Jan,

Vì bạn đã sử dụng một giao diện danh sách và lệnh của bạn là bên trong DataTemplate, các ràng buộc được gắn với bối cảnh ràng buộc của mỗi mô hình cá nhân trong ItemSource.

Một khoảng cách này là làm làm như sau:.

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

Vì vậy, bạn thiết lập các nguồn ràng buộc để tham khảo các nội dung bắt buộc của xem danh sách (tức là mô hình điểm của bạn hay "ArbeitsEinträgeList" Bạn cũng có thể thiết lập tham số lệnh là bối cảnh ràng buộc của mỗi mục riêng lẻ Như bạn có thể thấy tôi có x: Name = "Item" trên lưới và CommandParameter = "{Binding Source = {x: Tham chiếu Item}, Path = BindingContext}".

Đơn giản, việc khai báo các lệnh như thế này cho phép bạn xác định lệnh chung trong mô hình khung nhìn của bạn và khi lệnh được thực hiện bằng lệnh paramete r là bối cảnh ràng buộc của mục riêng lẻ.

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

Cảm ơn bạn rất nhiều. Giải pháp của bạn đang hoạt động. Thumbs up :) – JanMer

+0

Nếu 'DataTemplate' được định nghĩa từ tệp khác và được truy xuất như thế này:' '? – mr5

6

Đó là bởi vì bạn liên kết với một mục trong EintragList của bạn - bất động sản (đó là lý do ràng buộc của bạn đối với các thuộc tính văn bản như BeginnEnde hoạt động). Và lệnh-ràng buộc cố gắng để đạt được một lệnh trong một mục duy nhất từ ​​danh sách của bạn và không phải từ viewmodel của bạn.

Tùy chọn 1: Bạn đặt lệnh trong mục hạng của bạn và xử lý nhấn vào đó.

Lựa chọn 2: Cho ràng buộc của bạn rằng nguồn gốc nên trang của bạn (và không phải là mặt hàng duy nhất):

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

Chỉ cần chắc chắn, rằng tên của thư mục gốc phần tử trang của bạn được đặt x:Name="MyPageName"

để biết, mà mục bắn lệnh, bạn có thể thiết lập thuộc tính CommandParameter, sau đó được cũng được gửi tới các lệnh như một đối tượng:

CommandParameter="{Binding .}" 

Additionaly: W bạn đang sử dụng các mẫu bên ngoài để hiển thị các mục trong danh sách của bạn, bạn có thể thử something I described in another answer (cùng một nguyên tắc).

Các vấn đề liên quan