Переместить строку на уровень выше в ListView
Имеется список дел. Сохраняется в sql. Как реализовать, чтобы по нажатию кнопки переместить текущую запись, к примеру, с третьей строки на вторую и наоборот.
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MyTodoList.MainPage"
Title="Заметки">
<StackLayout>
<ListView x:Name="listView"
ItemSelected="OnListViewItemSelected">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.ContextActions>
<MenuItem Text="Delete" Clicked="OnDeleteCliked"/>
<MenuItem Text="Вверх" Clicked="MoveToTop"/>
<MenuItem Text="Вниз" Clicked="MoveToBottom"/>
</ViewCell.ContextActions>
<StackLayout Padding="16,12" Orientation="Horizontal">
<CheckBox IsChecked="{Binding Done}"
Color="Gray"/>
<Label Text="{Binding Text}"
TextColor="Black"/>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Button Text="+"
TextColor="Black"
HorizontalOptions="Center"
VerticalOptions="End"
Margin="15"
Clicked="OnAddClicked">
</Button>
</StackLayout>
public MainPage()
{
InitializeComponent();
}
protected override void OnAppearing()
{
base.OnAppearing();
listView.ItemsSource = App.Database.GetNotesAsync();
}
//добавление
private async void OnAddClicked(object sender, EventArgs e)
{
await Navigation.PushAsync(new ToDoListPage
{
BindingContext = new TodoModel()
});
}
//редактирование
async void OnListViewItemSelected(object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem != null)
{
await Navigation.PushAsync(new ToDoListPage
{
BindingContext = e.SelectedItem as TodoModel
});
}
}
//удаление
private async void OnDeleteCliked(object sender, EventArgs e)
{
MenuItem mi = sender as MenuItem;
var note = mi.BindingContext as TodoModel;
await App.Database.DeleteNoteAsync(note);
OnAppearing();
}
private void MoveToTop(object sender, EventArgs e)
{
}
private void MoveToBottom(object sender, EventArgs e)
{
}
}
public class ToDoData
{
readonly SQLiteAsyncConnection _todoData;
public ToDoData(string dbPath)
{
_todoData = new SQLiteAsyncConnection(dbPath);
_todoData.CreateTableAsync<TodoModel>().Wait();
}
public ObservableCollection<TodoModel> GetNotesAsync()
{
List<TodoModel> list = _todoData.Table<TodoModel>().ToListAsync().Result;
ObservableCollection<TodoModel> result = new ObservableCollection<TodoModel>(list);
return result;
}
public Task<TodoModel> GetNoteAsync(int id)
{
return _todoData.Table<TodoModel>()
.Where(i => i.ID == id)
.FirstOrDefaultAsync();
}
public Task<int> SaveNoteAsync(TodoModel note)
{
if (note.ID != 0)
{
return _todoData.UpdateAsync(note);
}
else
{
return _todoData.InsertAsync(note);
}
}
public Task<int> DeleteNoteAsync(TodoModel note)
{
return _todoData.DeleteAsync(note);
}
}