Ich habe eine gruppierte Xamarin ListView und fand es mühsam, die Werte innerhalb der ListView zu aktualisieren.Grouped Listview stürzt bei der zweiten Aktualisierung ab
ViewModel;
public class MainViewModel
{
private ObservableCollection<ObservableGroupCollection<string, TaskItem>> _userTasksGrouped;
public ObservableCollection<ObservableGroupCollection<string, TaskItem>> UserTasksGrouped
{
get => _userTasksGrouped;
set
{
_userTasksGrouped = value;
OnPropertyChanged();
}
}
private void PopulateMyTasks()
{
UserTasks.Clear();
foreach (var task in MyTasks)
{
UserTasks.Add(new TaskItem(task));
}
DoTaskGrouping();
}
private void DoTaskGrouping()
{
UserTasksGrouped.Clear();
var groupedData =
UserTasks
.OrderBy(ut => ut.Name)
.GroupBy(ut => ut.StateEnum.ToString())
.Select(ut => new ObservableGroupCollection<string, TaskItem>(ut))
.ToList();
foreach (var group in groupedData)
UserTasksGrouped.Add(group);
}
public void UpdateTaskItem(TaskChanged taskChanged)
{
// update listing
var usertask = UserTasksGrouped.First(utg => utg.Any(ut => ut.Task.Id == taskChanged.Task.Id))
.First(t => t.Task.Id == taskChanged.Task.Id);
if (usertask != null)
{
usertask.Task = taskChanged.Task;
}
else
{
// something else
}
DoTaskGrouping();
}
public MainViewModel()
{
UserTasks = new ObservableCollection<TaskItem>();
UserTasksGrouped = new ObservableCollection<ObservableGroupCollection<string, TaskItem>>();
}
}
XAML;
<ListView
IsGroupingEnabled="true"
ItemsSource="{Binding UserTasksGrouped}"
GroupDisplayBinding="{Binding Key}"
GroupShortNameBinding="{Binding Key}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ViewCell.View>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="50*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<BoxView
Grid.Row="0" Grid.RowSpan="2"
Grid.Column="0" Grid.ColumnSpan="2"
MinimumHeightRequest="16"
MinimumWidthRequest="16"
Margin="0"
Color="{Binding StatusColour}" />
<Label
Grid.Row="0" Grid.Column="2"
Text="{Binding Name}"
Style="{StaticResource LabelStyle}"
WidthRequest="200" />
</Grid>
</ViewCell.View>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Aufgabe Item:
public class TaskItem : INotifyPropertyChanged
{
private MyTask _task;
public MyTask Task
{
get => _task;
set
{
_task = value;
Name = value.Name;
OnPropertyChanged();
}
}
private string _name;
public string Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged();
}
}
public string StatusColour => "Green"
}
Das Problem, wenn ich rufe DoTaskGrouping() zum zweiten Mal eine Aktualisierung erzwingen die App mit einem UnhandledException abstürzt. Ich habe es geschafft, dies bis zu einem "Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt" -Fehler zu verfolgen, so dass ich die ViewCell.View hinzugefügt denke, es könnte Dinge zu beheben. Bitte helfen, ich habe ein paar Fragen;
- Wie behebe ich den Fehler "Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt" und erfolgreich aktualisiert meine gruppierte Auflistung.
- Observable-Sammlungen in beobachtbaren Sammlungen aktualisieren sich selbst. Bedeutet, wenn die Eigenschaften oder was ihre gruppiert durch ändert, auch die Gruppierung? Bedeutung ein Gegenstand kann zwischen den Gruppen bewegen?
- Klingt mein Ansatz aus MVVM-Perspektive? TaskItem könnte mit der Bereinigung fertig werden.
Siehe Link kann es Hilfe ist Ihnen https://forums.xamarin.com/discussion/34229/an-item-with-the-same-key-has-already-been-added-exception- when-adding-nested-scrollview-to-xaml – Pratik
Danke, ich habe das gelesen und zuvor eine ViewCell.View hinzugefügt. Leider hilft es meiner Situation nicht, stürzt immer noch auf Refresh ab. – wonea
Wo wird _userTasksGrouped erstellt? – hugoterelle