2017-02-11 2 views
1

Ich arbeite an einem UWP-Wahlleiter auf VS2015. Ich habe die Kandidatenklasse gemacht und stellen seine Eigenschaften wie folgt:Eine aktualisierte Eigenschaft eines Elements einer beobachtbaren Sammlung kann nicht abgerufen werden

public class Candidate 
{ 
    public int VoteCount { get; set; } 
    public string Name { get; set; } 
    public string Category { get; set; } 
    public CandidateSNo S_no { get; set; } 
    public CandidateCategoryNo Category_no { get; set; } 
} 

public enum CandidateCategoryNo 
{ 
    I, 
    II, 
    III, 
    IV, 
    V, 
    VI 
} 

public enum CandidateSNo 
{ 
    I, 
    II, 
    III 
} 

I eine CandidateManager Klasse gemacht haben Verfahren zum Speichern von und in ihm, ich habe eine beobachtbare Sammlung in einem Verfahren gespeichert sind, die die 5 Eigenschaften von jeweils einigen enthält Kandidaten. Hier ist die CandidateManager Klasse:

private static ObservableCollection<Candidate> getCandidate() 
    { 
     var _candidate = new ObservableCollection<Candidate>(); 

     _candidate.Add(new Candidate() { S_no = CandidateSNo.I, Category_no = CandidateCategoryNo.I, VoteCount = 0, Category = "President", Name = "A" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.II, Category_no = CandidateCategoryNo.I, VoteCount = 0, Category = "President", Name = "B" }); 
     _candidate.Add(new Candidate() { S_no = CandidateSNo.III, Category_no = CandidateCategoryNo.I, VoteCount = 0, Category = "President", Name = "C" }); 

     return _candidate; 
    } 

public static ObservableCollection<Candidate> GetAllCandidates() 
      { 
       ObservableCollection<Candidate> Candidates = CandidateManager.getCandidate(); 
       return Candidates; 
      } 

Ich mag die votecount jeden Kandidaten um 1 zu erhöhen, wenn jemand ihre Namen Taste auswählt. Ich habe 3 Knöpfe auf der Seite gemacht, die für die Auswahl des Kandidaten und eine Submit-Taste dienen, um ihre Wahl zu übermitteln. Danach soll der Ergebnis-Textblock anzeigen, welcher Kandidat ausgewählt wurde. Hier ist die XAML von der Startseite:

<Button Name="Cand2" Width="100" Height="100" FontSize="20" HorizontalAlignment="Center" VerticalAlignment="Top" Click="Cand2_Click"/> 

    <Button Name="Cand3" Width="100" Height="100" FontSize="20" HorizontalAlignment="Right" VerticalAlignment="Top" Click="Cand3_Click"/> 

    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Height="50" FontSize="30" Name="Res"/> 

    <Button Name="Submit" VerticalAlignment="Bottom" HorizontalAlignment="Center" Content="Submit" Click="Submit_Click" /> 

</Grid> 

Und hier ist die xaml.cs:

public MainPage() 
    { 
     this.InitializeComponent(); 
     ObservableCollection<Candidate> Candidates = CandidateManager.GetAllCandidates(); 

     Cand1.Content = CandidateManager.GetCandidateByCategoryAndSno(CandidateCategoryNo.I, CandidateSNo.I).Name; 
     Cand2.Content = CandidateManager.GetCandidateByCategoryAndSno(CandidateCategoryNo.I, CandidateSNo.II).Name; 
     Cand3.Content = CandidateManager.GetCandidateByCategoryAndSno(CandidateCategoryNo.I, CandidateSNo.III).Name; 
    } 

    private void Cand1_Click(object sender, RoutedEventArgs e) 
    { 
     ObservableCollection<Candidate> Candidates = CandidateManager.GetAllCandidates(); 
     Candidate chosenOne = Candidates.Where(c => c.Name == Cand1.Content).FirstOrDefault(); 
     chosenOne.VoteCount += 1; 
     Candidates.Where(c => c.Name == Cand1.Content).FirstOrDefault().VoteCount = chosenOne.VoteCount; 
    } 

    private void Cand2_Click(object sender, RoutedEventArgs e) 
    { 
     ObservableCollection<Candidate> Candidates = CandidateManager.GetAllCandidates(); 
     Candidate chosenOne = Candidates.Where(c => c.Name == Cand2.Content).FirstOrDefault(); 
     chosenOne.VoteCount += 1; 
     Candidates.Where(c => c.Name == Cand2.Content).FirstOrDefault().VoteCount = chosenOne.VoteCount; 
    } 

    private void Cand3_Click(object sender, RoutedEventArgs e) 
    { 
     ObservableCollection<Candidate> Candidates = CandidateManager.GetAllCandidates(); 
     Candidate chosenOne = Candidates.Where(c => c.Name == Cand3.Content).FirstOrDefault(); 
     chosenOne.VoteCount += 1; 
     Candidates.Where(c => c.Name == Cand3.Content).FirstOrDefault().VoteCount = chosenOne.VoteCount; 
    } 

    private void Submit_Click(object sender, RoutedEventArgs e) 
    { 
     ObservableCollection<Candidate> Candidates = CandidateManager.GetAllCandidates(); 
     Candidate chosenOne = Candidates.Where(c => c.VoteCount == 1).FirstOrDefault(); 
     if (chosenOne != null) 
      Res.Text = chosenOne.Name + " -- " + chosenOne.VoteCount.ToString(); 
     else 
      Res.Text = "null"; 
    } 

Das Problem, das ich bin vor ist, dass ich nicht in der Lage bin abrufen Die aktualisierte votecount und der Ergebnistextblock zeigt null. Dies ist nur eine kleine Dummy des Hauptprojekts, aber ich habe das gleiche Problem im Hauptprogramm. Ich möchte den votecount und andere Eigenschaften von Kandidaten aktualisieren, während das Programm ausgeführt wird, und sie bei Bedarf abrufen. Entschuldigung für den langen Code. Hoffe, du würdest helfen .. Danke!

+1

Sie speichern die Änderungen nie in der observablecollection. Du holst einen Gegenstand, fügst Stimmen hinzu und vergisst dann den Gegenstand, bis er wieder abgerufen wird. Die Stimmen werden nicht gespeichert. – Sami

+1

ObservableCollection benachrichtigt nicht über eine Änderung einer Eigenschaft ihres Elementtyps. Sie müssen die INotifyPropertyChanged-Schnittstelle in Ihrer Candidate-Klasse implementieren. – Clemens

Antwort

0

Sie sollten für die beobachtbare Sammlung Variablen auf Klassenebene verwenden und Änderungen an ihnen vornehmen.

Problem mit Ihrem Code ist, jede Methode hat ihre eigene lokale Observable Collection-Instanz. Ich habe einige Teile Ihres Codebehinds bearbeitet, siehe

ObservableCollection<Candidate> Candidates = null; 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     Candidates = CandidateManager.GetAllCandidates(); 

     Cand1.Content = CandidateManager.GetCandidateByCategoryAndSno(CandidateCategoryNo.I, CandidateSNo.I).Name; 
     Cand2.Content = CandidateManager.GetCandidateByCategoryAndSno(CandidateCategoryNo.I, CandidateSNo.II).Name; 
     Cand3.Content = CandidateManager.GetCandidateByCategoryAndSno(CandidateCategoryNo.I, CandidateSNo.III).Name; 
    } 

    private void Cand1_Click(object sender, RoutedEventArgs e) 
    { 
     Candidate chosenOne = Candidates.Where(c => c.Name == Cand1.Content).FirstOrDefault(); 
     chosenOne.VoteCount += 1; 
     Candidates.Where(c => c.Name == Cand1.Content).FirstOrDefault().VoteCount = chosenOne.VoteCount; 
    } 

    private void Cand2_Click(object sender, RoutedEventArgs e) 
    { 
     Candidate chosenOne = Candidates.Where(c => c.Name == Cand2.Content).FirstOrDefault(); 
     chosenOne.VoteCount += 1; 
     Candidates.Where(c => c.Name == Cand2.Content).FirstOrDefault().VoteCount = chosenOne.VoteCount; 
    } 

    private void Cand3_Click(object sender, RoutedEventArgs e) 
    { 
     Candidate chosenOne = Candidates.Where(c => c.Name == Cand3.Content).FirstOrDefault(); 
     chosenOne.VoteCount += 1; 
     Candidates.Where(c => c.Name == Cand3.Content).FirstOrDefault().VoteCount = chosenOne.VoteCount; 
    } 

    private void Submit_Click(object sender, RoutedEventArgs e) 
    { 
     Candidate chosenOne = Candidates.Where(c => c.VoteCount == 1).FirstOrDefault(); 
     if (chosenOne != null) 
      Res.Text = chosenOne.Name + " -- " + chosenOne.VoteCount.ToString(); 
     else 
      Res.Text = "null"; 
    } 
+0

Tut mir leid, aber das habe ich nicht ganz verstanden. Wo soll ich diese drei machen? Eine auf der Seite, eine CandidateManager-Klasse und die dritte? –

+0

Ich habe meine Antwort bearbeitet, bitte gehen Sie durch. –

+0

Danke, es funktioniert in der Dummy-App. Aber leider nicht in der Haupt-App, in der ich Eingaben (Name, Kategorie. Votecount) vom Benutzer auf einer Seite und Anzeige der Ausgabe auf einer anderen Seite nehme. Ich habe versucht, dies auch in den Methoden der CandidateManager-Klasse zu tun, aber es erfordert, dass ich für jede Methode eine beobachtbare Sammlung mache. Und es wird 6 Seiten geben, also muss ich für diese auch 6 verschiedene beobachtbare Sammlungen machen. Kann ich nicht einfach eins machen und es zu einem universellen machen, damit ich von überall in dieser App darauf zugreifen kann. Vielen Dank! –

Verwandte Themen