Я работаю над проводником выходов UWP на VS2015. Я сделал класс кандидата и установить его свойства следующим образом:Невозможно получить обновленное свойство элемента наблюдаемой коллекции
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
}
Я сделал класс CandidateManager для хранения методов и в нем, я хранится наблюдаемую коллекции в методе, который содержит 5 свойств каждого из некоторых кандидатов. Вот класс CandidateManager:
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;
}
Я хочу votecount каждого кандидата увеличится на 1 каждый раз, когда кто-то выбирает кнопку их имена. Я сделал 3 кнопки на странице, которые предназначены для выбора кандидата и кнопки «Отправить», чтобы отправить свой выбор. После этого текстовый блок результата должен показать, какой кандидат был выбран. Вот XAML из MainPage:
<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>
И вот 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";
}
Проблема я столкнулся является то, что я не могу получить обновленный votecount и текстовый блок результатов показывают null. Это всего лишь малый макет основного проекта, но я столкнулся с той же проблемой в основной программе. Я хочу обновить votecount и другие свойства кандидата, когда программа запускается и извлекает их по мере необходимости. Извинения за длинный код. Надеюсь, ты поможешь .. Спасибо!
Вы никогда не сохраняете изменения наблюдаемого коллекционирования. Вы получаете элемент, затем добавляете голоса, а затем забываете элемент, пока не получите его снова. Голоса не сохраняются. – Sami
ObservableCollection не уведомляет об изменении свойства своего типа элемента. Вам нужно будет реализовать интерфейс INotifyPropertyChanged в классе Candidate. – Clemens