Удалить элемент ListView на основе привязки контекста - PullRequest
0 голосов
/ 25 апреля 2018

Я создал список, который заполняется из БД SQLite.XML выглядит следующим образом:

<ListView x:Name="CalculationListview" ItemsSource="{Binding Calculation}" HasUnevenRows="true">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                    <Label Text="{Binding Qty}"></Label>
                    <Label Text="{Binding Note}"></Label>
                    <Button Text="Delete" Clicked="Handle_Clicked"></Button>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

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

Я уже создал метод удаления из базы данных, который принимает данный объект.

public Task<int> DeleteCalculationAsync(Calculation calculation)
{
    return database.DeleteAsync(calculation);
}

К сожалению, я не знаю, как извлечь объект из моего связующего контекста, чтобы я мог удалить элемент.Очевидно, у меня уже есть обработчик события, по которому щелкнули:

void Handle_Clicked(object sender, System.EventArgs e)
{
    App.Database.DeleteCalculationAsync(SOMETHING HERE);
}

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Если вы не хотите использовать ContextActions или не можете, потому что должны следовать некоторым требованиям к дизайну, вы можете добавить привязку к кнопке StyleId к идентификатору или что-то в вашем классе вычислений, чтобы идентифицировать элементв вашем списке расчетов, а затем на основе этого в вашем событии нажатия кнопки удалить расчет.

<Button StyleId="{Binding Id}" Text="Delete" Clicked="Handle_Clicked"/>

Тогда в вашем событии клика

void Handle_Clicked(object sender, System.EventArgs e)
{
    var button = sender as Button;
    var calculation = calculations.Where(c => c.Id == button.StyleId).FirstOrDefault();
    App.Database.DeleteCalculationAsync(calculation);
}
0 голосов
/ 25 апреля 2018

Контекстные действия

Я рекомендую переместить функцию удаления в Контекстные действия .

Контекстные действия появятся на iOS, когда пользователь проведет пальцем справа налево на ViewCell и на Android, когда пользователь длительно нажмет на ViewCell.

Пример снимка экрана

Этот снимок экрана взят из документов Xamarin.Forms и не отражает приведенный ниже код.

код

<ListView x:Name="CalculationListview" ItemsSource="{Binding Calculation}" HasUnevenRows="true">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <ViewCell.ContextActions>
                    <MenuItem Text="Delete" IsDestructive="True" Clicked="Handle_Delete"/>
                 </ViewCell.ContextActions>
                <StackLayout>
                    <Label Text="{Binding Qty}"></Label>
                    <Label Text="{Binding Note}"></Label>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
async void Handle_Delete(object sender, System.EventArgs e)
{
    var viewCellSelected = sender as MenuItem;
    var calculationToDelete = viewCellSelected?.BindingContext as Calculation;

    await App.Database.DeleteCalculationAsync(calculationToDelete);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...