Как связать два разных элемента

#c# #xamarin

#c# #xamarin

Вопрос:

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

  public class MyClass{

 public StackLayout SavedHoursLayout = new StackLayout {};
 public Label RemoveHoursLabel;
 public TapGestureRecognizer RemoveTapped;
 public Grid HoursRemoveGrid;
 public Button AddHoursButton = new Button();
 public Label Correct = new Label{Text="Correct"};
 public list<Label> ItemsLayout = new list<Label>();

 public MyClass()
 {
      Content = new StackLayout
        {
            Children = { AddHoursButton,SavedHoursLayout }
        }
        AddHoursButton.Clicked =AddHoursButton_Clicked;

 }
    public void AddSavedHours()
     {
      Label Time = new Label { };
      RemoveHoursLabel = new Label { 
     Text="remove",TextColor=Color.Red,FontAttributes=FontAttributes.Italic};
      HoursRemoveGrid = new Grid();
      RemoveTapped = new TapGestureRecognizer();
      this.BindingContext = HoursRemoveGrid;

      HoursRemoveGrid.Children.Add(Time,0,0);
      HoursRemoveGrid.Children.Add(RemoveHoursLabel,1,0);
      SavedHoursLayout.Children.Add(HoursRemoveGrid);

      RemoveHoursLabel.GestureRecognizers.Add(RemoveTapped);
      RemoveTapped.Tapped  = RemoveTapped_Tapped;
      ItemsLayout.Children.Add(Correct);

      void RemoveTapped_Tapped(object sender, EventArgs e)
      {
       var grid = (sender as Label).Parent as Grid;
       int position = SavedHoursLayout.Children.IndexOf(grid);
        SavedHoursLayout.Children.RemoveAt(position);
      }
     }

       private void AddHoursButton_Clicked(object sender, System.EventArgs e)
     {
        AddSavedHours();
     }
 }
  

Вопрос
Теперь, когда я нажимаю RemoveHourLabel , я хочу удалить Label Correct в ItemsLayout , соответствующий RemovehoursGrid .

ПРИМЕЧАНИЕ В ItemsLayout уже есть несколько меток, поэтому у каждой Label Correct индекс не совпадает с индексом ее корреспондента RemoveHoursGrid .

Комментарии:

1. код портит пользовательский интерфейс и логику данных. вряд ли возможно. попробуйте использовать mvvm ?

2. @LeiYang, спасибо, но как это вообще помогает?

3. я думаю о mvvm, когда вы говорите «привязка» в названии. однако я не видел ничего связанного. вместо этого весь стиль winforms.

4. @LeiYang, я изменил string Correct на Label Correct .

5. «это. BindingContext = HoursRemoveGrid;» — это очень, очень неправильно

Ответ №1:

Решение:

Вы можете создать новый list<Label> для хранения меток, чтобы у него был тот же индекс, что и у его корреспондента RemoveHoursGrid .

Сначала создайте новый список, давайте назовем его tempItemsLayout :

 public List<Label> tempItemsLayout = new List<Label>();
  

Затем в вашем методе AddSavedHours также добавьте правильное значение в tempItemsLayout:

 public void AddSavedHours()
{    
    //...other codes

    RemoveHoursLabel.GestureRecognizers.Add(RemoveTapped);
    RemoveTapped.Tapped  = RemoveTapped_Tapped;
    ItemsLayout.Add(Correct);

    //Add the correct to tempItemsLayout too
    tempItemsLayout.Add(Correct);

    //...other codes
}
  

Затем в вашем RemoveTapped_Tapped удалите метку как из tempItemsLayout, так и из ItemsLayout:

 void RemoveTapped_Tapped(object sender, EventArgs e)
    {
        var grid = (sender as Label).Parent as Grid;
        int position = SavedHoursLayout.Children.IndexOf(grid);
        SavedHoursLayout.Children.RemoveAt(position);

        Label tempLabel = tempItemsLayout[position];

        //Remove the label from both tempItemsLayout and ItemsLayout
        tempItemsLayout.Remove(tempLabel);

        ItemsLayout.Remove(tempLabel);
}
  

Попробуйте и дайте мне знать, если это сработает.

Комментарии:

1. Я получаю сообщение об ошибке при ` Label tempLabel = tempItemsLayout[position];` говорят, что индекс находится вне диапазона. но это не первый раз, когда я получаю эту ошибку, это всегда происходит, когда я пытаюсь использовать int position более одного раза (то есть я уже использовал это в SavedHoursLayout.Children.RemoveAt(position); ).

2. @лоис, я не могу воспроизвести ошибку на своей стороне. Есть ли в вашем проекте какой-либо другой код, помимо кодов из вашего вопроса? Используете ли вы SavedHoursLayout где-нибудь еще? Вы можете опубликовать весь свой код, чтобы я мог протестировать его для вас.