2014-06-16 3 views
0

Je suis nouveau à WPF et je travaille sur Databinding une zone de liste à partir d'un fichier xml, tout charge correctement lorsque le programme démarre, mais je vais avoir du mal à faire la mise à jour listbox après insérer un nouveau record. Tout ce que j'ai lu pointe vers une ObservableCollection que je suis, mais je n'arrive pas à comprendre comment actualiser la Listbox. J'ai essayé d'appeler une mise à jour à ItemsSource mais cela ne semble toujours pas fonctionner. Idéalement, je voudrais juste avoir un bouton Actualiser qu'un utilisateur peut cliquer pour mettre à jour la liste. Quelqu'un at-il des suggestions sur l'appel d'une mise à jour la liste Merci MichaelMise à jour WPF Listbox Databinding

public class ContactList 
{ 
    string contactFile = @"U:\Peridot\Users\" + Program.getUser.ToString() + ".xml"; 

    public ContactList() 
    { 
    } 

    public ContactList(string contactFullName, string contactCellNumber,string contactBusinessNumber, string contactExtension, string contactEmail, string contactStatus,string contactAuralinkStatus, string contactAuralinkID) 
    { 
     this.ContactFullName = contactFullName; 
     this.ContactCellNumber = contactCellNumber; 
     this.ContactBusinessNumber = contactBusinessNumber; 
     this.ContactExtension = contactExtension; 
     this.ContactEmail = contactEmail; 
     this.ContactStatus = contactStatus; 
     this.ContactAuralinkStatus = contactAuralinkStatus; 
     this.ContactAuralinkID = contactAuralinkID; 
    } 



    private string ContactFullName; 

    public string PropContactFullName 
    { 
     get { return ContactFullName; } 
     set { ContactFullName = value; } 
    } 

    private string ContactCellNumber; 

    public string PropContactCellNumber 
    { 
     get { return ContactCellNumber; } 
     set { ContactCellNumber = value; } 
    } 

    private string ContactBusinessNumber; 

    public string PropContactBusinessNumber 
    { 
     get { return ContactBusinessNumber; } 
     set { ContactBusinessNumber = value; } 
    } 

    private string ContactEmail; 

    public string PropContactEmail 
    { 
     get { return ContactEmail; } 
     set { ContactEmail = value; } 
    } 

    private string ContactStatus; 

    public string PropContactStatus 
    { 
     get { return ContactStatus; } 
     set { ContactStatus = value; } 
    } 

    private string ContactAuralinkStatus; 

    public string PropContactAuralinkStatus 
    { 
     get { return ContactAuralinkStatus; } 
     set { ContactAuralinkStatus = value; } 
    } 


    public string ContactAuralinkID; 

    public string PropContactAuralinkID 
    { 
     get { return ContactAuralinkID; } 
     set { ContactAuralinkID = value; } 
    } 


    private string ContactExtension; 

    public string PropContactExtension 
    { 
     get { return ContactExtension; } 
     set { ContactExtension = value; } 
    } 


} 

public class Contacts : System.Collections.ObjectModel.ObservableCollection<ContactList> 
{ 
    string contactFile = @"U:\Peridot\Users\" + Program.getUser.ToString() + ".xml"; 

//Added this 
    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    protected virtual void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    { 
     if (CollectionChanged != null) 
     { 
      CollectionChanged(this, e); 
     } 
    } 

    public Contacts(): base() 
    { 

     getContactFile(); 

     XDocument doc = XDocument.Load(contactFile); 
     var contacts = from r in doc.Descendants("Contact") 
         select new 
         { 
          FullName = r.Element("FullName").Value, 
          CellNumber = r.Element("CellNumber").Value, 
          BusinessNumber = r.Element("BusinessNumber").Value, 
          Extension = r.Element("Extension").Value, 
          Email = r.Element("Email").Value, 
          AuralinkID = r.Element("AuralinkID").Value 
         }; 
     foreach (var r in contacts) 
     { 
      Add(new ContactList(r.FullName,r.CellNumber , r.BusinessNumber,r.Extension, r.Email, "", "",r.AuralinkID)); 
     } 
    } 


    private void getContactFile() 
    { 
     if (!File.Exists(contactFile)) 
     { 
      new XDocument(
       new XElement("Contacts" 
       ) 
      ) 
      .Save(contactFile); 
     } 
    } 
} 


private void addContactICON_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (!doesContactExist()) 
     { 
      try 
      { 

       XDocument doc = XDocument.Load(@"U:\Peridot\Users\" + Program.getUser.ToString() + ".xml"); 
       XElement contact = new XElement("Contact"); 
       contact.Add(new XElement("ContactID", contactID.ToString())); 
       contact.Add(new XElement("FullName", contactNameLBL.Content.ToString())); 
       contact.Add(new XElement("CellNumber", c1.Content.ToString())); 
       contact.Add(new XElement("BusinessNumber", businessPhoneIcon.ToolTip.ToString())); 
       contact.Add(new XElement("Extension", c3.Content.ToString())); 
       contact.Add(new XElement("Email", emailIcon.ToolTip.ToString())); 
       contact.Add(new XElement("AuralinkID", videoIcon.ToolTip.ToString())); 

       doc.Element("Contacts").Add(contact); 
       doc.Save(@"U:\Peridot\Users\" + Program.getUser.ToString() + ".xml"); 
       MessageBox.Show(contactNameLBL.Content.ToString() + " has been added to your contacts."); 


      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 
     else 
      MessageBox.Show("Contact Already Exists"); 
    } 

XAML

<StackPanel> 
    <StackPanel.Resources> 
     <local:Contacts x:Key="contactListobj"></local:Contacts> 
    </StackPanel.Resources> 
    <ListBox x:Name="contactList" Width="305" Margin="5,3,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" ItemsSource="{Binding Source={StaticResource contactListobj}}" Height="450" IsSynchronizedWithCurrentItem="True"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" > 
        <TextBlock Text="{Binding PropContactFullName}" ToolTip="{Binding PropContactFullName}" Height="35" Width="175" FontSize="12"/> 
        <TextBlock x:Name="contactEmailLBL" Text="{Binding PropContactEmail}" ToolTip="{Binding PropContactEmail}" Cursor="Hand" Width="30" Height="35" MouseLeftButtonUp="contactEmailLBL_MouseLeftButtonUp" Foreground="{x:Null}" FontSize="1"> 
         <TextBlock.Background> 
          <ImageBrush Stretch="Uniform" ImageSource="Images/emailICON.png"/> 
         </TextBlock.Background> 
        </TextBlock> 
        <TextBlock x:Name="cellNumberLBL" Text="{Binding PropContactCellNumber}" ToolTip="{Binding PropContactCellNumber}" Cursor="Hand" MouseLeftButtonUp="cellNumberLBL_MouseLeftButtonUp" Width="30" Height="35" Foreground="{x:Null}" FontSize="1"> 
         <TextBlock.Background> 
          <ImageBrush Stretch="Uniform" ImageSource="Images/mobilePhoneICON.png"/> 
         </TextBlock.Background> 
        </TextBlock> 
        <TextBlock x:Name="businessNumberLBL" Text="{Binding PropContactBusinessNumber}" ToolTip="{Binding PropContactBusinessNumber}" Cursor="Hand" Width="30" Height="35" MouseLeftButtonUp="businessNumberLBL_MouseLeftButtonUp" Foreground="{x:Null}" FontSize="1"> 
         <TextBlock.Background> 
          <ImageBrush Stretch="Uniform" ImageSource="Images/BusinessPhoneICON.png"/> 
         </TextBlock.Background> 
        </TextBlock> 
        <TextBlock x:Name="auralinkLBL" Text="{Binding PropContactAuralinkID}" ToolTip="{Binding PropContactAuralinkID}" Cursor="Hand" Width="30" Height="35" Foreground="{x:Null}" FontSize="1" MouseLeftButtonUp="auralinkLBL_MouseLeftButtonUp"> 
         <TextBlock.Background> 
          <ImageBrush Stretch="Uniform" ImageSource="Images/VideoICON.png"/> 
         </TextBlock.Background> 
        </TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</StackPanel> 
+0

Je ne vois pas le 'ObservableCollection' dans votre code. Êtes-vous sûr de l'utiliser? – BradleyDotNET

+0

Je dois l'implémenter de manière incorrecte car je pense que je dois utiliser un événement virtuel public NotifyCollectionChangedEventHandler CollectionChanged quelque part dans cette classe, mais je ne suis pas sûr de savoir comment appeler. Depuis le changement se passe dans le fichier. – perirose

Répondre

0

D'après ce que je peux dire à partir du code source pour ObservableCollection, le problème est le plus probable que la méthode Add que vous utilisez pour ajouter ContactList objets à votre ObservableCollection fait partie de la classe Collection que ObservableCollection hérite de. Cela ne se déclenche pas l'événement CollectionChanged sur le ObservableCollection de sorte que votre liaison est jamais informé que la collection a changé. Essayez d'appeler la méthode protégée OnCollectionChanged après avoir ajouté chaque élément à la collection.

+0

Je vais l'essayer et de faire rapport, grâce – perirose

+0

je mis à jour ma classe pour ajouter un NotifyCollectionChanged mais je suis encore incertain comment appeler la OnCollectionChanged – perirose