Получить идентификатор Swiped Row из сетки данных syncfusion

Я пытаюсь получить данные из пропущенной строки с помощью события SwipeEnded, но событие SwipeEnded возвращает выбранный элемент без данных

введите здесь описание изображения

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>

Основная модель просмотра

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()
        {

        }

    }
}

ViewModel, которую используют строки, но отправляется в основную ViewModel.

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, prism v6.2.0 Syncfusion 14.4.0.15. в основном он работает на Sony Xperia Z3 с Android версии 6.0.1 и с использованием API 23, я также тестирую его на виртуальном iPhone 6s плюс IOS 10.0

Любая помощь приветствуется


person Zarp    schedule 16.12.2016    source источник
comment
SelectedIndex назначено, можете ли вы не использовать этот индекс против вашей модели данных   -  person SushiHangover    schedule 16.12.2016


Ответы (2)


Вы можете получить RowData, обработав событие SwipeEnded. SwipeEndedEventArgs есть RowData. Пожалуйста, обратитесь к приведенному ниже примеру кода.

private void dataGrid_SwipeEnded(object sender, SwipeEndedEventArgs e)
{
   var rowdata = e.RowData;
}
person Ashok    schedule 19.12.2016
comment
я не мог достичь события SwipeEndedEventArgs при использовании MVVM, но в итоге я не использовал MVVM, а просто использовал код, после чего у меня не было проблем с получением данных - person Zarp; 21.12.2016

Проблема в том, что вам нужно создать конвертер, чтобы получить аргументы событий в вашу модель представления. Если вы посмотрите здесь в источнике вы можете видеть, что вам нужен преобразователь для передачи значений. Я бы изменил поведение EventToCommand для события SwipeEnded на это:

<b:EventToCommand 
    EventName="SwipeEnded"
    Command="{Binding SwipeCommand}"
    EventArgsConverter="{StaticResource swipeEndedEventArgsConverter}" />

затем используйте конвертер следующим образом:

public class SwipeEndedEventArgsConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var itemSwipeEndedEventArgs = value as SwipeEndedEventArgs;
        if (itemSwipeEndedEventArgs == null)
        {
            throw new ArgumentException($"Expected value to be of type {nameof(SwipeEndedEventArgs)}", nameof(value));
        }
        return itemSwipeEndedEventArgs;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Не забудьте добавить это в словарь ресурсов, чтобы вы могли использовать его в XAML, например, из ресурса страницы контента:

<ContentView.Resources>
    <ResourceDictionary>
        <converters:SwipeEndedEventArgsConverter x:Key="swipeEndedEventArgsConverter" />
    </ResourceDictionary>
</ContentView.Resources>

И добавьте пространство имен в xaml:

xmlns:converters="clr-namespace:Project.Converters;assembly=Project"
person Iain Smith    schedule 05.06.2019