Mega Code Archive

 
Categories / Silverlight / Data
 

Receiving Change Notifications for Bound Data

<UserControl x:Class='SilverlightApplication3.MainPage'     xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'      xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'     xmlns:d='http://schemas.microsoft.com/expression/blend/2008'      xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'      mc:Ignorable='d'      d:DesignWidth='640'      d:DesignHeight='480'     xmlns:local="clr-namespace:SilverlightApplication3">   <UserControl.Resources>     <local:EmployeeCollection x:Key="REF_EmployeeCollection"/>     <DataTemplate x:Key="DT_Employee">       <StackPanel Orientation="Horizontal">         <TextBlock Text="{Binding FirstName}" />         <TextBlock Text="{Binding LastName}"/>       </StackPanel>     </DataTemplate>   </UserControl.Resources>   <StackPanel>     <ListBox x:Name="lbx_Employees"             ItemTemplate="{StaticResource DT_Employee}"              ItemsSource="{StaticResource REF_EmployeeCollection}"              SelectionChanged="lbx_Employees_SelectionChanged" />       <Button  x:Name="btn_New" Click="btn_New_Click" Content="New Employee"/>       <TextBox Text="{Binding FirstName, Mode=TwoWay}"/>       <TextBox Text="{Binding LastName, Mode=TwoWay}"/>       <TextBlock Text="Last"/>       <TextBlock Text="First"/>       <TextBlock Text="Name"/>       <TextBlock Text="Street"/>       <TextBox Text="{Binding Address.Street, Mode=TwoWay}"/>       <TextBlock Text="City"/>       <TextBlock Text="State"/>       <TextBlock Text="Zip"/>       <TextBox Text="{Binding Address.City, Mode=TwoWay}"/>       <TextBox Text="{Binding Address.State, Mode=TwoWay}"/>       <TextBox Text="{Binding Address.ZipCode, Mode=TwoWay}"/>       <TextBlock Text="Phone"/>       <TextBox Text="{Binding PhoneNum, Mode=TwoWay}"/>       <Button Content="Close" x:Name="btnClose" Click="btnClose_Click"/>     </StackPanel> </UserControl> //File: Page.xaml.cs using System.Windows; using System.Windows.Controls; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel; namespace SilverlightApplication3 {   public class Employee : INotifyPropertyChanged   {     public event PropertyChangedEventHandler PropertyChanged;     private void RaisePropertyChanged(PropertyChangedEventArgs e)     {       if (PropertyChanged != null)         PropertyChanged(this, e);     }     public Employee()     {     }     private string _FirstName;     public string FirstName     {       get { return _FirstName; }       set       {         string OldVal = _FirstName;         if (OldVal != value)         {           _FirstName = value;           RaisePropertyChanged(new PropertyChangedEventArgs("FirstName"));         }       }     }     private string _LastName;     public string LastName     {       get { return _LastName; }       set       {         string OldVal = _LastName;         if (OldVal != value)         {           _LastName = value;           RaisePropertyChanged(new PropertyChangedEventArgs("LastName"));         }       }     }     private long _PhoneNum;     public long PhoneNum     {       get { return _PhoneNum; }       set       {         long OldVal = _PhoneNum;         if (OldVal != value)         {           _PhoneNum = value;           RaisePropertyChanged(new PropertyChangedEventArgs("PhoneNum"));         }       }     }     private Address _Address;     public Address Address     {       get { return _Address; }       set       {         Address OldVal = _Address;         if (OldVal != value)         {           _Address = value;           RaisePropertyChanged(new PropertyChangedEventArgs("Address"));         }       }     }   }   public class Address : INotifyPropertyChanged   {     public event PropertyChangedEventHandler PropertyChanged;     private void RaisePropertyChanged(PropertyChangedEventArgs e)     {       if (PropertyChanged != null)         PropertyChanged(this, e);     }     private string _Street;     public string Street     {       get { return _Street; }       set       {         string OldVal = _Street;         if (OldVal != value)         {           _Street = value;           RaisePropertyChanged(new PropertyChangedEventArgs("Street"));         }       }     }     private string _City;     public string City     {       get { return _City; }       set       {         string OldVal = _City;         if (OldVal != value)         {           _City = value;           RaisePropertyChanged(new PropertyChangedEventArgs("City"));         }       }     }     private string _State;     public string State     {       get { return _State; }       set       {         string OldVal = _State;         if (OldVal != value)         {           _State = value;           RaisePropertyChanged(new PropertyChangedEventArgs("State"));         }       }     }     private int _ZipCode;     public int ZipCode     {       get { return _ZipCode; }       set       {         int OldVal = _ZipCode;         if (OldVal != value)         {           _ZipCode = value;           RaisePropertyChanged(new PropertyChangedEventArgs("ZipCode"));         }       }     }   }   public class EmployeeCollection : ICollection<Employee>,     IList<Employee>,     INotifyCollectionChanged   {     private List<Employee> _internalList;     public EmployeeCollection()     {       _internalList = new List<Employee>();     }     public event NotifyCollectionChangedEventHandler CollectionChanged;     private void RaiseCollectionChanged(NotifyCollectionChangedEventArgs e)     {       if (CollectionChanged != null)       {         CollectionChanged(this, e);       }     }     public void Add(Employee item)     {       _internalList.Add(item);       RaiseCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add,item, _internalList.Count - 1));     }     public void Clear()     {       _internalList.Clear();       RaiseCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));     }     public bool Remove(Employee item)     {       int idx = _internalList.IndexOf(item);       bool RetVal = _internalList.Remove(item);       if (RetVal)         RaiseCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, idx));       return RetVal;     }     public void RemoveAt(int index)     {       Employee item = null;       if (index < _internalList.Count)         item = _internalList[index];       _internalList.RemoveAt(index);       if (index < _internalList.Count)         RaiseCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, index));     }     public void Insert(int index, Employee item)     {       _internalList.Insert(index, item);       RaiseCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item, index));     }     public Employee this[int index]     {       get { return _internalList[index]; }       set       {         _internalList[index] = value;         RaiseCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace, value, index));       }     }     public bool Contains(Employee item)     {       return _internalList.Contains(item);     }     public void CopyTo(Employee[] array, int arrayIndex)     {       _internalList.CopyTo(array, arrayIndex);     }     public int Count     {       get { return _internalList.Count; }     }     public bool IsReadOnly     {       get { return ((IList<Employee>)_internalList).IsReadOnly; }     }     public IEnumerator<Employee> GetEnumerator()     {       return _internalList.GetEnumerator();     }     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()     {       return (System.Collections.IEnumerator)_internalList.GetEnumerator();     }     public int IndexOf(Employee item)     {       return _internalList.IndexOf(item);     }   }   public partial class MainPage : UserControl   {     public MainPage()     {       InitializeComponent();       EmployeeCollection empColl = (EmployeeCollection)lbx_Employees.ItemsSource;       empColl.Add(new Employee       {         FirstName = "A",         LastName = "B",         PhoneNum = 2,         Address = new Address         {           Street = "2 Street",           City = "City",           State = "NY",           ZipCode = 10006         }       });     }     private void btn_New_Click(object sender, RoutedEventArgs e)     {       EmployeeCollection empColl = (EmployeeCollection)lbx_Employees.ItemsSource;       Employee newEmp = new Employee();       newEmp.Address = new Address();       empColl.Add(newEmp);       lbx_Employees.SelectedItem = newEmp;     }     private void lbx_Employees_SelectionChanged(object sender,SelectionChangedEventArgs e)     {            }     private void btnClose_Click(object sender, RoutedEventArgs e)     {            }   } }