2016-12-16 39 views
0

我试着从刷卡行与事件获取数据SwipeEnded 但SwipeEnded事件返回无数据则selectedItem获取刷卡行ID

enter image description here

XAML代码

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" 
      prism:ViewModelLocator.AutowireViewModel="True" 
      xmlns:sfgrid="clr-namespace:Syncfusion.SfDataGrid.XForms;assembly=Syncfusion.SfDataGrid.XForms" 
      xmlns:b="clr-namespace:Xamarin.Behaviors;assembly=Xamarin.Behaviors" 
      x:Class="PrismUnityApp2.Views.Hovedside" 
      xmlns:sys="clr-namespace:System;assembly=mscorlib" 
      Title="test"> 

    <ContentPage.Content> 
    <Grid> 
     <Grid.RowDefinitions> 
     <RowDefinition Height="20" /> 
     <RowDefinition Height="50"/> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="50" /> 
     <RowDefinition Height="50" /> 
     </Grid.RowDefinitions> 

     <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <DatePicker Date="{Binding SelectedDate,Mode=TwoWay}" MinimumDate="{Binding MinimumSelectedDate,Mode=TwoWay}" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" HorizontalOptions="Center"> 
     <DatePicker.Format>dd-MM-yyyy</DatePicker.Format> 
     </DatePicker> 

     <sfgrid:SfDataGrid x:Name="dataGrid" 
        AutoGenerateColumns="False" 
        AllowSwiping="true" 
        ColumnSizer="Star" 
        SelectedIndex="1" 
        SelectionMode="Single" 
       ItemsSource="{Binding ToemmeListe}" 
        AllowSorting="True" 
          Grid.Row="2" 
          Grid.Column="0" Grid.ColumnSpan="3" 
         > 
     <b:Interaction.Behaviors> 
      <b:BehaviorCollection> 
      <b:EventToCommand Command="{Binding SelectionCommand}" 
           CommandParameter="{x:Reference Name=dataGrid}" 
           EventName="SelectionChanged" /> 
      <b:EventToCommand Command="{Binding SwipeCommand}" 
          CommandParameter="{x:Reference Name=dataGrid}" 
          EventName="SwipeEnded" /> 
      </b:BehaviorCollection> 
     </b:Interaction.Behaviors> 
     <sfgrid:SfDataGrid.Columns x:TypeArguments="syncfusion:Columns"> 
      <sfgrid:GridTextColumn HeaderText="Fraktion" 
            MappingName="Fraktion" /> 
      <!--Fraktion--> 
      <sfgrid:GridTextColumn HeaderText="Type" 
            MappingName="Type" /> 
      <!--Type--> 
      <sfgrid:GridTextColumn HeaderText="Vaegt" 
            MappingName="Vaegt" /> 
      <!--vægt--> 
     </sfgrid:SfDataGrid.Columns> 

     <sfgrid:SfDataGrid.LeftSwipeTemplate> 
      <DataTemplate> 
      <ContentView BackgroundColor="#1AAA87" > 
       <Grid IsVisible="True"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width ="20" /> 
        <ColumnDefinition Width ="*" /> 
       </Grid.ColumnDefinitions> 

       <Label Grid.Column="1" 
        Text ="Slet" 
        HorizontalTextAlignment="Start" 
        VerticalTextAlignment="Center" 
        LineBreakMode ="NoWrap" 
        BackgroundColor="Red" 
        TextColor ="White"/> 


       </Grid> 
      </ContentView> 
      </DataTemplate> 
     </sfgrid:SfDataGrid.LeftSwipeTemplate> 

     </sfgrid:SfDataGrid> 


     <Button Text="Menu" FontSize="24" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="3" HorizontalOptions="Center" Command="{Binding popup}"/> 

    </Grid> 


    </ContentPage.Content> 

</ContentPage> 

Main viewmodel

using Prism.Commands; 
using Prism.Mvvm; 
using Prism.Navigation; 
using Syncfusion.SfDataGrid.XForms; 
using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Linq; 
using System.ServiceModel; 
using System.Threading.Tasks; 
using Xamarin.Forms; 

namespace PrismUnityApp2.ViewModels 
{ 


    public class HovedsideViewModel : BindableBase, INotifyPropertyChanged, INavigationAware 
    { 
     MobileService.VaksServiceClient ws = new MobileService.VaksServiceClient(); 
     INavigationService _navigationService; 
     public event PropertyChangedEventHandler PropertyChanged; 


     #region Properties 
     private DateTime selectedDate; 
     public DateTime SelectedDate 
     { 
      get { return selectedDate; } 
      set 
      { 
       if (selectedDate != value) 
       { 
        selectedDate = value; 

        if (PropertyChanged != null) 
        { 
         PropertyChanged(this, 
          new PropertyChangedEventArgs("SelectedDate")); 

        } 
       } 
      } 
     } 

     private DateTime minimumSelectedDate; 
     public DateTime MinimumSelectedDate 
     { 
      get { return minimumSelectedDate; } 
      set 
      { 
       if (minimumSelectedDate != value) 
       { 
        minimumSelectedDate = value; 

        if (PropertyChanged != null) 
        { 
         PropertyChanged(this, 
          new PropertyChangedEventArgs("MinimumSelectedDate")); 
        } 
       } 
      } 
     } 

     public DelegateCommand Navigatetest { get; private set; } 
     public DelegateCommand NavigateToBestilling { get; private set; } 
     public DelegateCommand popup { get; private set; } 

     public string latitude { get; set; } 
     private string _longitude; 

     public string longitude 
     { 
      get { return _longitude; } 
      set { _longitude = value; } 
     } 

     public String PladsID { get; set; } 

     private ObservableCollection<ToemningData> toemmeListe; 

     public ObservableCollection<ToemningData> ToemmeListe 
     { 
      get { return toemmeListe; } 
      set { this.toemmeListe = value; } 
     } 
     #endregion 



     public HovedsideViewModel(INavigationService navigationService) 
     { 

      SetRowData(); // initialize the grid 


      SelectedDate = DateTime.Today.AddDays(1); 


      _navigationService = navigationService; 
      Navigatetest = new DelegateCommand(Navigate); 
      NavigateToBestilling = new DelegateCommand(_NavigateToBestilling); 
      popup = new DelegateCommand(_popup); 

      selectionCommand = new Command<SfDataGrid>(onSelectionChanged); 
      swipeCommand = new Command<SfDataGrid>(onSwipeChanged); 
      selectedItems = new ObservableCollection<object>(); 
     } 

     private Command<SfDataGrid> selectionCommand; 
     public Command<SfDataGrid> SelectionCommand 
     { 
      get { return selectionCommand; } 
      set { selectionCommand = value; } 
     } 

     private Command<SfDataGrid> swipeCommand; 
     public Command<SfDataGrid> SwipeCommand 
     { 
      get { return swipeCommand; } 
      set { swipeCommand = value; } 
     } 

     private ObservableCollection<object> selectedItems; 

     public ObservableCollection<object> SelectedItems 
     { 
      get { return selectedItems; } 
      set { selectedItems = value; } 
     } 

     private void onSelectionChanged(SfDataGrid obj) 
     { 
      //gets the selected items in the datagrid 
      selectedItems = obj.SelectedItems; 
     } 

     private void onSwipeChanged(SfDataGrid obj) 
     { 

      selectedItems = obj.SelectedItems; // returns null on all properties 
     } 




     async void _popup() 
     { 
      Xamarin.Forms.Device.BeginInvokeOnMainThread(async() => 
      { 
       var action = await App.Current.MainPage.DisplayActionSheet("ActionSheet: SavePhoto?", null, null, "Manuel bestilling", "Scan", "Send", "Fortryd"); 
       switch (action) 
       { 
        case "Manuel bestilling": 
         _NavigateToBestilling(); 
         break; 
        case "Scan": 
         Navigate(); 
         break; 
        case "Send": 
         // TODO make webservice that sends recipe 
         break; 
        case "Fortryd": 
         // Nothing 
         break; 
        default: 
         break; 
       } 
      }); 


     } 

     MobileService.Toemning ToWCFServiceTodoItem(MobileService.Toemning item) 
     { 
      return new MobileService.Toemning 
      { 
       Fraktion = item.Fraktion, 
       ToemmeId = item.ToemmeId, 
       Type = item.Type, 
       date = item.date, 
       Latitude = item.Latitude, 
       Longitude = item.Longitude, 
       Weight = item.Weight, 
       PladsId = item.PladsId 
      }; 
     } 


     public async Task<ObservableCollection<MobileService.Toemning>> CallService(MobileService.Toemning item) 
     { 
      var todoItem = ToWCFServiceTodoItem(item); 
      MobileService.VaksServiceClient client = new MobileService.VaksServiceClient(new BasicHttpBinding(), new EndpointAddress("http://kss.vestfor.dk/Vaks2Svc/VaksService.svc?singleWsdl")); 
      var t = Task<ObservableCollection<MobileService.Toemning>>.Factory.FromAsync(
        ((MobileService.IVaksService)client.InnerChannel).BeginGetToemmeDatasByPladsId, 
        ((MobileService.IVaksService)client.InnerChannel).EndGetToemmeDatasByPladsId, 
        todoItem, TaskCreationOptions.None); 
      return await t; 
     } 

     public void SetRowData() 
     { 

      try 
      { 
       toemmeListe = new ObservableCollection<ToemningData>(); 
      } 
      catch (Exception ex) 
      { 

       throw; 
      } 

      ToemningData _ToemningData = new ToemningData(); 
      _ToemningData.Parent = this; 
      ToemmeListe.Add(_ToemningData); 
     } 



     #region Navigation 
     private void _NavigateToBestilling() 
     { 
      var p = new NavigationParameters(); 
      p.Add("pladsid", PladsID); 
      var ttttt = DateTime.Today; 
      if (SelectedDate.Date > DateTime.Now.Date) 
      { 
       p.Add("selecteddate", SelectedDate); 
      } 
      _navigationService.NavigateAsync("Bestilling", p); 

     } 

     private void Navigate() 
     { 
      var p = new NavigationParameters(); 
      p.Add("pladsid", PladsID); 
      p.Add("selecteddate", SelectedDate); 
      _navigationService.NavigateAsync("Scanner", p); 
     } 

     public void OnNavigatedFrom(NavigationParameters parameters) 
     { 

     } 

     public async void OnNavigatedTo(NavigationParameters parameters) 
     { 
      PladsID = parameters["pladsid"].ToString(); 


      if (parameters.ContainsKey("selecteddate")) 
      { 

       SelectedDate = DateTime.Parse(parameters["selecteddate"].ToString()); 
      } 
      GridUpdate(); 
     } 
     #endregion 

     public void GridUpdate() 
     { 
      Xamarin.Forms.Device.BeginInvokeOnMainThread(async() => 
      { 
       // if the phone inst near latitude "55,7070631" and longitude "12,4235393" then remove the part where it gets data from parameters 
       // and use the two lines under this 
       //latitude = "55,7070631"; 
       //longitude = "12,4235393"; 
       var ggg = await CallService(new MobileService.Toemning { PladsId = Convert.ToInt32(PladsID), date = new DateTime(2016, 11, 1) }); // the date is set to a day where there is data // TODO set date = DateTime.Today.AddDays(1); 

       ToemmeListe.Clear(); 
       foreach (var toemming in ggg) 
       { 

        ToemningData _ToemningData = new ToemningData(); 
        _ToemningData.Parent = this; 
        _ToemningData.Fraktion = toemming.Fraktion; 
        _ToemningData.ToemmeID = toemming.ToemmeId; 
        _ToemningData.Type = toemming.Type; 
        _ToemningData.Vaegt = toemming.Weight; 
        ToemmeListe.Add(_ToemningData); 
       } 

      }); 

     } 

     public void GridDelete() 
     { 

     } 

    } 
} 

视图模型,该行使用,但被发送到主视图模型

using Prism.Commands; 
using System; 
using System.ComponentModel; 
using Xamarin.Forms; 

namespace PrismUnityApp2.ViewModels 
{ 
    public class ToemningData : INotifyPropertyChanged 
    { 

     public DelegateCommand DeleteRow { get; private set; } 

     public ToemningData() 
     { 
      DeleteRow = new DelegateCommand(_DeleteRow); 
     } 



     private void _DeleteRow() // Do not delete anything from yesterday or before 
     { 
      // TODO get the ID of the selected(swiped) ROW 
      // TODO sendt it to GridDelete() where it will make a WS call and remove that row of data 
      //Parent.GridDelete(); 
      Parent.GridUpdate(); 

     } 


     private int toemmeID { get; set; } 
     public int ToemmeID 
     { 
      get 
      { 
       return toemmeID; 
      } 
      set 
      { 
       this.toemmeID = value; 
       RaisePropertyChanged("ToemmeID"); 
      } 
     } 

     private string fraktion { get; set; } 
     public string Fraktion 
     { 
      get 
      { 
       return fraktion; 
      } 
      set 
      { 
       this.fraktion = value; 
       RaisePropertyChanged("Fraktion"); 
      } 
     } 

     private string type { get; set; } 
     public string Type 
     { 
      get 
      { 
       return type; 
      } 
      set 
      { 
       this.type = value; 
       RaisePropertyChanged("Type"); 
      } 

     } 

     private string vaegt { get; set; } 
     public string Vaegt 
     { 
      get 
      { 
       return vaegt; 
      } 
      set 
      { 
       this.vaegt = value; 
       RaisePropertyChanged("Vaegt"); 
      } 
     } 

     private string transportType { get; set; } 
     public string TransportType 
     { 
      get 
      { 
       return transportType; 
      } 
      set 
      { 
       this.transportType = value; 
       RaisePropertyChanged("TransportType"); 
      } 
     } 

     private int transportTypeID { get; set; } 
     public int TransportTypeID 
     { 
      get 
      { 
       return transportTypeID; 
      } 
      set 
      { 
       this.transportTypeID = value; 
       RaisePropertyChanged("TransportTypeID"); 
      } 
     } 

     private string pickerfraktion { get; set; } 
     public string PickerFraktion 
     { 
      get 
      { 
       return pickerfraktion; 
      } 
      set 
      { 
       this.pickerfraktion = value; 
       RaisePropertyChanged("PickerFraktion"); 
      } 
     } 

     private int pickerfraktionID { get; set; } 
     public int PickerFraktionID 
     { 
      get 
      { 
       return pickerfraktionID; 
      } 
      set 
      { 
       this.pickerfraktionID = value; 
       RaisePropertyChanged("PickerFraktionID"); 
      } 
     } 

     public HovedsideViewModel Parent { get; internal set; } 

     #region INotifyPropertyChanged implementation 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void RaisePropertyChanged(String Name) 
     { 
      if (PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(Name)); 
     } 

     #endregion 
    } 
} 

有没有什么办法可以通过滑动它,而不是使用 SelectionChanged事件得到一个行数据?

即时通讯使用visual studio 2015社区,xamarin.Forms 2.3.3.168,棱镜v6.2.0 Syncfusion 14.4.0.15。主要运行它搭载Android 6.0.1版本一个索尼XPERIA Z3和使用API​​ 23我还用它测试的虚拟iphone 6S加IOS 10.0

任何帮助深表赞赏

+0

'SelectedIndex'分配,你能不能使用,对您的数据模型 – SushiHangover

回答

0

你可以得到RowData通过处理SwipeEnded事件。 SwipeEndedEventArgsRowData。请参考下面的代码示例。

private void dataGrid_SwipeEnded(object sender, SwipeEndedEventArgs e) 
{ 
    var rowdata = e.RowData; 
} 
+0

指数,而使用MVVM 我够不到SwipeEndedEventArgs事件,但我最终没有使用MVVM,只是使用的代码背后 后来我没有问题得到的数据 – Zarp

+0

但谢谢你的答案 – Zarp