2014-06-16 207 views
0

我是WPF的新手,並且正在從xml文件數據綁定列表框中,當程序啓動時一切都會正確加載,但是我在插入新記錄後無法使列表框更新。我讀過的所有內容都指向使用ObservableCollection,但我無法弄清楚如何讓Listbox刷新。我曾嘗試調用對ItemsSource的更新,但它似乎仍然不起作用。理想情況下,我想只有一個刷新按鈕,用戶可以點擊更新列表框。有沒有人有一個調用一個更新列表框中的任何建議 感謝邁克爾WPF更新列表框數據綁定

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

我在代碼中看不到ObservableCollection。你確定你在使用它嗎? – BradleyDotNET

+0

我必須錯誤地實現它,因爲我認爲我需要在此類中的某處使用公共虛擬事件NotifyCollectionChangedEventHandler CollectionChanged,但我不確定如何對其進行調用。由於更改發生在文件中。 – perirose

回答

0

從我可以基於爲ObservableCollection的源代碼來講,這個問題是最有可能您正在使用的添加方法將聯繫人列表對象添加到您的ObservableCollection集合的一部分類即ObservableCollection繼承自。這並不會觸發ObservableCollection上的CollectionChanged事件,因此您的綁定永遠不會通知該集合已更改。將每個項目添加到集合後,請嘗試調用OnCollectionChanged受保護的方法。

+0

我會嘗試一下並回報,謝謝 – perirose

+0

我更新了我的課程以添加NotifyCollectionChanged,但我仍然不確定如何調用OnCollectionChanged – perirose