2010-08-25 14 views
6

Ho un oggetto padre chiamato pagina che ha una lista di oggetti chiamati controllo:Notifica Un oggetto quando una proprietà di un altro oggetto cambia

public class Page 
{ 
    List<CustomControl> controls {get;set;} 
} 

La classe CustomControl ha la seguente definizione a:

public class CustomControl 
{ 
string Name {get;set;} 
string Value {get;set;} 
} 

Si supponga ad esempio che la classe Page abbia due CustomControls A e B. È possibile notificare il controllo personalizzato B quando la proprietà Value del controllo personalizzato A cambia in modo che possa modificare alcune delle sue proprietà.

Stavo pensando di attuare l'evento INotifyPropertyChanged sulla classe CustomControl ora come faccio a notificare un'istanza della CustomControl quando un'altra istanza della stessa classe ha alcune proprietà della sua modifica.

+0

Ecco il link MSDN che ne parla http://msdn.microsoft.com/en-us/library/ms743695.aspx – kalehv

risposta

5
public class CustomControl : INotifyPropertyChanged 
{ 
    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      if (_name == value) return; 
      _name = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 

    private string _value; 
    public string Value 
    { 
     get { return _value; } 
     set 
     { 
      if (_value == value) return; 

      _value = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Value")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

    internal virtual void OnSiblingInPagePropertyChanged(object sender, PropertyChangedEventArgs args) 
    { 

    } 
} 

public class CustomControlObservableColletion : ObservableCollection<CustomControl> 
{ 
    // Required because, by default, it is not possible to find out which items 
    // have been cleared when the CollectionChanged event is fired after a .Clear() call. 
    protected override void ClearItems() 
    { 
     foreach (var item in Items.ToList()) 
      Remove(item); 
    } 

} 

public class Page 
{ 
    public IList<CustomControl> Controls { get; private set; } 

    public Page() 
    { 
     var controls = new CustomControlObservableColletion(); 
     controls.CollectionChanged += OnCollectionChanged; 
     Controls = controls; 
    } 

    private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     switch (e.Action) 
     { 
      case NotifyCollectionChangedAction.Add: 
       RegisterControls(e.NewItems); 
       break; 

      case NotifyCollectionChangedAction.Replace: 
       RegisterControls(e.NewItems); 
       DeRegisterControls(e.OldItems); 
       break; 

      case NotifyCollectionChangedAction.Remove: 
       DeRegisterControls(e.OldItems); 
       break; 
     } 
    } 

    private void RegisterControls(IList controls) 
    { 
     foreach (CustomControl control in controls) 
      control.PropertyChanged += OnControlPropertyChanged; 
    } 

    private void DeRegisterControls(IList controls) 
    { 
     foreach (CustomControl control in controls) 
      control.PropertyChanged -= OnControlPropertyChanged; 
    } 

    private void OnControlPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     foreach (var control in Controls.Where(c => c != sender)) 
      control.OnSiblingInPagePropertyChanged(sender, e); 
    } 
} 
+0

Grazie per la soluzione sarà provarlo e ti faccio sapere come è andata – Manthan

+0

@Manthan: Ha funzionato? – Ani

+0

Ci scusiamo per il ritardo. Funziona per me. Grazie – Manthan

0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace PropertyNotificatioDemo 

{ 

    class Program 

    { 

     static void Main(string[] args) 

     { 

      PropertyNotification notification = new PropertyNotification(); //Create an object of PropertyNotification class. 

      //Create EmployeeValueChange handler. 

      PropertyNotification.EmployeeValueChange += new PropertyNotification.EmployeeNameHandler(PropertyNotification_EmployeeValueChange); 



      //Display a message. 

      Console.Write("Enter Value : "); 

      //Read a value and initilize it in property. 

      notification.EmployeeName = Console.ReadLine(); 

     } 



     //Handler for property notification is created. 

     static void PropertyNotification_EmployeeValueChange(object sender, EventArgs e) 

     { 

      Console.WriteLine("Employee name is changed."+sender); 

     } 

    } 



    public class PropertyNotification 

    { 

     //Create a private variable which store value. 

     private static string _employeeName; 

     //Create a delegate of named EmployeeNamed=Handler 

     public delegate void EmployeeNameHandler(object sender, EventArgs e); 



     //Create a event variable of EmployeeNameHandler 

     public static event EmployeeNameHandler EmployeeValueChange; 



     //Create a static method named OnEmployeeNameChanged 

     public static void OnEmployeeNameChanged(EventArgs e) 

     { 

      if (EmployeeValueChange != null) 

       EmployeeValueChange(_employeeName, e); 

     } 



     //Create a property EmployeeName 

     public string EmployeeName 

     { 

      get 

      { 

       return _employeeName; 

      } 

      set 

      { 

       //Check if value of property is not same. 

       if (_employeeName != value) 

       { 

        OnEmployeeNameChanged(new EventArgs()); 

        _employeeName = value; 

       } 

      } 

     } 

    } 

} 
Problemi correlati