#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
где-нибудь еще? Вы можете опубликовать весь свой код, чтобы я мог протестировать его для вас.