2017-02-11 3 views
1

Я работаю над проводником выходов 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 и другие свойства кандидата, когда программа запускается и извлекает их по мере необходимости. Извинения за длинный код. Надеюсь, ты поможешь .. Спасибо!

+1

Вы никогда не сохраняете изменения наблюдаемого коллекционирования. Вы получаете элемент, затем добавляете голоса, а затем забываете элемент, пока не получите его снова. Голоса не сохраняются. – Sami

+1

ObservableCollection не уведомляет об изменении свойства своего типа элемента. Вам нужно будет реализовать интерфейс INotifyPropertyChanged в классе Candidate. – Clemens

ответ

0

Вы должны использовать переменные уровня класса для наблюдаемой коллекции и вносить изменения в нее.

Проблема с вашим кодом заключается в том, что каждый метод имеет свой собственный локальный наблюдаемый экземпляр коллекции. Я отредактировал несколько частей вашего кода, см.

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

Извините, но я не совсем понял это. Где все я должен сделать эти три? Один на странице, один класс CandidateManager и третий? –

+0

Я отредактировал мой ответ, пожалуйста, пройдите. –

+0

Спасибо, что работает в фиктивном приложении. Но, к сожалению, не в основном приложении, в котором я принимаю вход (имя, категория. Votecount) от пользователя на одной странице и выводят вывод на другой. Я тоже пытался это сделать в методах класса CandidateManager, но для этого требуется, чтобы я сделал одну наблюдаемую коллекцию для каждого метода. И будет 6 страниц, поэтому я должен сделать для них 6 разных наблюдаемых коллекций. Разве я не могу сделать это и объявить его универсальным, чтобы я мог получить доступ к нему из любого места в этом приложении. Благодаря! –

Смежные вопросы