2017-07-06 9 views
0

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;

  1. Wie behebe ich den Fehler "Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt" und erfolgreich aktualisiert meine gruppierte Auflistung.
  2. 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?
  3. Klingt mein Ansatz aus MVVM-Perspektive? TaskItem könnte mit der Bereinigung fertig werden.
+0

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

+0

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

+0

Wo wird _userTasksGrouped erstellt? – hugoterelle

Antwort

0

Fest durch Entfernen aus dem MainViewModel

public ObservableCollection<ObservableGroupCollection<string, TaskItem>> UserTasksGrouped 

DoTaskGrouping() den Aufbau der Sammlung sich jedes mal;

UserTasksGrouped = new ObservableCollection<ObservableGroupCollection<string, TaskItem>>(groupedData); 
Verwandte Themen