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!
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
ObservableCollection benachrichtigt nicht über eine Änderung einer Eigenschaft ihres Elementtyps. Sie müssen die INotifyPropertyChanged-Schnittstelle in Ihrer Candidate-Klasse implementieren. – Clemens