WedX - журнал о программировании и компьютерных науках

Получение пропущенного элемента и установка его BindingContext заполняет ListView

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

Посмотреть список


<ListView
                        x:Name="MyList"
                        Grid.Row="1"
                        HasUnevenRows="True"
                        HeightRequest="10"
                        BackgroundColor="White"
                        IsGroupingEnabled="True"
                        IsPullToRefreshEnabled="false"
                        ItemsSource="{Binding LogItems}"
                        IsRefreshing="{Binding IsBusy, Mode=OneWay}"
                        RefreshCommand="{Binding LoadLogsCommand}"
                        SeparatorVisibility="None"                        
                        >
                        <ListView.ItemTemplate>
                            <DataTemplate >
                                <ViewCell Height="70">
                                    <StackLayout Orientation="Vertical"  VerticalOptions="Start"  >

                                        <SwipeView SwipeStarted="SwipeView_SwipeStarted" x:Name="mySwipeView" >                                            

                                            <Grid>
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="5"/>
                                                    <RowDefinition Height="36"/>
                                                    <RowDefinition Height="36"/>
                                                    <RowDefinition Height="60"/>                                                
                                                </Grid.RowDefinitions>

                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="100"/>
                                                    <ColumnDefinition Width="20"/>
                                                    <ColumnDefinition Width="110"/>
                                                    <ColumnDefinition Width="20"/>
                                                    <ColumnDefinition Width="100"/>
                                                    <ColumnDefinition Width="36"/>
                                                
                                                </Grid.ColumnDefinitions>
                                                
                                                <Label
                                                       Grid.Row="1"
                                                       Grid.Column="0"
                                                       VerticalOptions="Center"
                                                       FontAttributes="None"                                       
                                                       Text="{Binding  .Name}"
                                                       TextColor="Black"
                                                       Margin="0, 0,0, 0"
                                                       Padding="20,10,0,0"
                                                       FontFamily="Hiragino Sans"
                                                       FontSize="14"
                                                       HeightRequest="53"                                      
                                                  />
...
                                                </Grid>
                                            </Grid>
                                            <SwipeView.RightItems>
                                                <SwipeItems Mode="Reveal" SwipeBehaviorOnInvoked="Close" >

                                                    <SwipeItemView Invoked="OnDeleteSwipeItemInvoked" >
                                                        <StackLayout Orientation="Vertical" WidthRequest="200" BackgroundColor="Red">
                                                            <StackLayout HorizontalOptions="Start">
                                                                <Image Source="deleteIcon3.png" HeightRequest="25" WidthRequest="25" Margin="70,15,0,0" />
                                                                <Label Text=" Delete" TextColor="White" FontSize="15" HorizontalOptions="CenterAndExpand" Margin="70,0,0,0"/>
                                                            </StackLayout>
                                                        </StackLayout>
                                                    </SwipeItemView>
                                                   </SwipeItems>
                                            </SwipeView.RightItems>
                                        </SwipeView>
                                    </StackLayout>
                                </ViewCell>
                            </DataTemplate>                              
                        </ListView.ItemTemplate>

Код позади


private void SwipeView_SwipeStarted(object sender, SwipeItemView e, SwipedEventArgs f, SwipeChangingEventArgs g) //SwipeStartedEventArgs e)
        {
            // var theItem = (myLogsModel)f.SelectedItem;
           var item = sender as SwipeItem;

           var model = item.BindingContext as myLogsModel;

var x = model.Name; ...

}


Пожалуйста, может ли кто-нибудь помочь мне с тем, как получить удаленный элемент, не влияя на мой список?


  • ListView имеет встроенное контекстное меню, которое активируется смахиванием или длительным нажатием. Есть ли причина, по которой вы не можете использовать это? Или вам нужно использовать SwipeView, вы пробовали его с CollectionView вместо ListView? 25.01.2021
  • Мне нужно зафиксировать данные украденного элемента, как я могу сделать это с помощью встроенной функции в коде? 25.01.2021
  • Прочтите документы — docs.microsoft.com/en- мы/xamarin/xamarin-forms/пользовательский интерфейс/ 25.01.2021
  • Я не могу полностью реструктурировать свой список, поскольку он построен на нескольких привязках данных в каждой строке, и невозможно использовать элемент меню для элемента сетки.... 25.01.2021
  • Я действительно не уверен, чего вы пытаетесь достичь, поэтому трудно предложить исправление. Вы можете попробовать, как я уже предлагал, использовать CollectionView 25.01.2021

Ответы:


1

Из Xamarin.Forms SwipeView мы можем увидеть, что SwipeStarted запускается, когда начинается свайп. Объект SwipeStartedEventArgs, сопровождающий это событие, имеет свойство SwipeDirection типа SwipeDirection.

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

Я делаю один образец, который вы можете посмотреть:

<ListView ItemsSource="{Binding items}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <SwipeView>
                                <SwipeView.RightItems>
                                    <SwipeItems>
                                        <SwipeItemView Invoked="SwipeItemView_Invoked">
                                            <StackLayout
                                                BackgroundColor="Red"
                                                Orientation="Vertical"
                                                WidthRequest="200">
                                                <StackLayout HorizontalOptions="Start">
                                                    <Image
                                                        Margin="70,15,0,0"
                                                        HeightRequest="25"
                                                        Source="delete.png"
                                                        WidthRequest="25" />
                                                    <Label
                                                        Margin="70,0,0,0"
                                                        FontSize="15"
                                                        HorizontalOptions="CenterAndExpand"
                                                        Text=" Delete"
                                                        TextColor="White" />
                                                </StackLayout>
                                            </StackLayout>
                                        </SwipeItemView>
                                      
                                    </SwipeItems>
                                </SwipeView.RightItems>
                                <!--  Content  -->
                                <SwipeView.Content>
                                    <Grid
                                        BackgroundColor="LightGray"
                                        HeightRequest="60"
                                        WidthRequest="300">
                                        <Label
                                            HorizontalOptions="Center"
                                            Text="{Binding title}"
                                            VerticalOptions="Center" />
                                    </Grid>
                                </SwipeView.Content>

                            </SwipeView>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

public partial class Page4 : ContentPage
{
    public ObservableCollection<menuitem> items { get; set; }
    public Page4()
    {
        InitializeComponent();
        items = new ObservableCollection<menuitem>()
        {
            new menuitem(){title="title 1"},
            new menuitem(){title="title 2"},
            new menuitem(){title="title 3"},
            new menuitem(){title="title 4"},
            new menuitem(){title="title 5"},
            new menuitem(){title="title 6"}

        };
        this.BindingContext = this;
    }

   
    private void SwipeItemView_Invoked(object sender, EventArgs e)
    {
        SwipeItemView item = sender as SwipeItemView;
        menuitem model = item.BindingContext as menuitem;
      
    }
}

public class menuitem
{
    public string title { get; set; }
}

Как сказал Джейсон, мы также предлагаем вам использовать контекстное меню ListView, не нужно использовать SwipView. Выберите один элемент и нажмите и удерживайте, чтобы открыть контекстное меню, как показано на следующем снимке экрана.

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

 <ListView ItemsSource="{Binding items}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.ContextActions>
                            <MenuItem Clicked="OnMore" Text="More" />
                            <MenuItem Clicked="OnDelete" Text="Delete" />
                        </ViewCell.ContextActions>
                        <StackLayout>
                            <Label Text="{Binding title}" />
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

  private void OnMore(object sender, EventArgs e)
    {
        MenuItem item = sender as MenuItem;
        menuitem model = item.BindingContext as menuitem;
    }

Об интерактивности ListView, пожалуйста, взгляните:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/interactivity

26.01.2021
  • Спасибо, Черри Бу, ваш ответ действительно помог мне, решил мою проблему и понял эту тему. Решение menuitem также полезно знать, если/когда мне нужно создать список без использования сетки. оценил. 26.01.2021
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]