Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[c# / xaml]Binding ObservableCollection nukkig

Pagina: 1
Acties:

  • Bioman
  • Registratie: Maart 2008
  • Laatst online: 07:52
Op het moment ben ik bezig om mijn eerste Windows Phone 8 app te maken. Daarbij loop ik aan tegen een probleem, namelijk het correct laten binden van de ObservableCollection uit mijn ViewModel.cs aan de View.xaml. Deze wil namelijk niet zonder omweg binden. Ik zal de relevante code zo hieronder zo kort mogelijk samenvatten.

Mijn xaml ziet er zo uit:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
<pivot title=mijnApp">
<phone:PivotItem Header="Uitslagen">
  <phone:LongListSelector ItemsSource="{Binding Path=TeamLijst}" >
    <phone:LongListSelector.ItemTemplate>
      <DataTemplate>
        <TextBlock Text="{Binding Voornaam}" />
        <TextBlock Text="{Binding Achternaam}" />
      </DataTemplate>
    </phone:LongListSelector.ItemTemplate>
  </phone:LongListSelector>
</phone:PivotItem>
</pivot>


De relevante codebehind:
C#:
1
2
3
4
5
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    this.DataContext = App.ViewModel;
    App.ViewModel.Refresh();
}


Vervolgens maak in mijn ViewModel de TeamLijst aan. Deze vult gewoon normaal. Als ik deze alleen zoals in Refres() direct wegschrijf dan krijg ik het niet voor elkaar om de gegevens aan de view te binden. Ik heb vanalles met INotifyChanged en ICommand geprobeerd, maar daar kwam ik niet uit.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public ObservableCollection<persoon> TeamLijst { get; set; }

// Werkt Niet
public async void Refresh()
{
    Team team = new Team();
    TeamLijst = await team.GeefTeam();
}

// Werkt wel
public async void RefreshLand()
{
    Team team = new Team();
    temp = await team.GeefTeam();
    foreach (var item in temp)
    {
         TeamLijst.Add(item);
     }
}


Waarom werkt dit met die Foreach loop opeens magisch wel? En hebben jullie tip hoe ik dit zonder zulke lelijke extra code voor elkaar kan krijgen? Ik heb al heel veel sites afgezocht (msdn!) en ik heb het idee dat ik in de hoek van INotifyChanged moet zoeken, maar deze krijg ik niet onder de knie.

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 13:43
Door
C#:
1
TeamLijst = await team.GeefTeam(); 

ken je een andere instantie toe aan TeamLijst, en is er dus feitelijk geen binding meer. Verder zit mijn xaml kennis te diep weggestopt om er iets zinnigs over te zeggen :)

[ Voor 22% gewijzigd door sig69 op 24-10-2013 16:14 ]

Roomba E5 te koop


  • Bioman
  • Registratie: Maart 2008
  • Laatst online: 07:52
Oke, als dat de binding verbreekt dan zal het lastig worden. Dan heeft het maken van INotifyChange events ook niet zoveel zin :P

  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 21-11 14:22

dotcode

///\00/\\

Misschien:

C#:
1
2
3
4
5
6
7
private  ObservableCollection<persoon> teamLijst;
public ObservableCollection<persoon> TeamLijst { 
get {return teamLijst; } 
set{
  teamLijst = value;
  OnPropertyChanged("TeamLijst");
} } 

Je maakt er namelijk een andere lijst van.

[ Voor 3% gewijzigd door dotcode op 24-10-2013 16:35 ]


  • CM5
  • Registratie: Maart 2003
  • Niet online

CM5

Inderdaad zoals dotcode aangeeft de INotifyPropertyChanged interface toepassen op je class, en de binding definieren als:

XML:
1
2
3
<pivot title=mijnApp">
<phone:PivotItem Header="Uitslagen">
  <phone:LongListSelector ItemsSource="{Binding Path=TeamLijst, updatesourcetrigger=propertychanged}" >


Het CollectionChanged zal dan afgaan bij de .add()

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 22-11 18:52

Sebazzz

3dp

En als je toch met de ellende van INotifyPropertyChanged begint, doe het dan goed en laat de tooling het voor je oplossen :) Gebruik Fody.PropertyChanged.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


  • Bioman
  • Registratie: Maart 2008
  • Laatst online: 07:52
Ik heb het uiteindelijk voor elkaar gekregen met de volgende code.
Nu het ik niet eens in mijn xaml de updatesourcetrigger gezet, en toch werkt het. Ik begin toch steeds meer in VooDoo te geloven. 8)7

Snippet Viemodel:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public ObservableCollection<persoon> TeamList
{ 
  get { return TeamPrivate; }
  set { this.SetProperty(ref this.TeamPrivate, value); }
}
private ObservableCollection<persoon> TeamPrivate;

public event PropertyChangedEventHandler PropertyChanged;
   
protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)
{
    if (object.Equals(storage, value)) return false;
        storage = value;
        this.OnPropertyChanged(propertyName);
        return true;
    }

protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    var eventHandler = this.PropertyChanged;
        if (eventHandler != null)
            eventHandler(this, new PropertyChangedEventArgs(propertyName));
}


Snipper Xaml.Cs bestand
C#:
1
2
3
4
5
protected override void OnNavigatedTo(NavigationEventArgs e)
{
    App.ViewCompetitionModel.Refresh()
    denaamvanmijnpivot.DataContext = App.ViewCompetitionModel;
}


Over PropertyChanged.Fody, dat heb ik eerst links laten liggen omdat ik het wilde begrijpen, en ik niet zeker wist of het met wp8 zou werken. Maar ik heb er net wat over opgezocht en het lijkt toch wel een mooi concept. Mooi klusje voor in het weekend :*)
Pagina: 1