2016-07-21 11 views
1

im Moment habe ich derzeit eine Sammlung von Benutzern. Ich verwende die Sammlung, um mein ItemsControl mit einem Datamaplate aus Checkboxen zu füllen. Ich bevölkere das erste Element mit einem Select AllBenachrichtigung über Eigentumsänderung eines Artikels innerhalb einer Sammlung

Analysts.Add(new UserDTO 
{ 
    Id   = 0, 
    Name  = "Select All", 
    IsSelected = true 
}); 

Ich frage mich, wie erstelle ich die Veranstaltung, so dass, wenn eine der Kontrollkästchen aktiviert wird, wird ein Ereignis ausgelöst wird. Ich habe versucht, Analysts.CollectionChanged += Analysts_CollectionChanged; setzen, aber das würde nicht wirklich Feuer, wenn die Sammlung buchstäblich geändert wird, nicht die Elementeigenschaften.

UsersDTO.cs

public int Id {get; set;} 
private string _name; 
public string Name 
{ 
    get { return _name; } 
    set {_name = value; OnPropertyChanged("Name");} 
} 

private bool _isSelected; 
public bool IsSelected 
{ 
    get { return _isSelected; } 
    set { _isSelected = value; OnPropertyChanged("IsSelected"); } 
} 

DismissAppointmentView

<ItemsControl Grid.Column="1" Grid.Row="1" ItemsSource="{Binding Analysts, UpdateSourceTrigger=PropertyChanged}" IsTabStop="False"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <telerik:RadUniformGrid Rows="2"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <CheckBox telerik:StyleManager.Theme="Windows8" Margin="3 3 12 3" Content="{Binding Name}" IsChecked="{Binding IsSelected, Mode=TwoWay}"/> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Antwort

1

Sie könnte so etwas wie diese verwenden möchten:

public class ObservableCollectionEx<T> : ObservableCollection<T> where T : INotifyPropertyChanged 
    { 
     public ObservableCollectionEx() : base() { } 

     public ObservableCollectionEx(List<T> list) 
      : base((list != null) ? new List<T>(list.Count) : list) 
     { 
      CopyFrom(list); 
     } 

     public ObservableCollectionEx(IEnumerable<T> collection) 
     { 
      if (collection == null) 
       throw new ArgumentNullException("collection"); 
      CopyFrom(collection); 
     } 

     private void CopyFrom(IEnumerable<T> collection) 
     { 
      IList<T> items = Items; 
      if (collection != null && items != null) 
      { 
       using (IEnumerator<T> enumerator = collection.GetEnumerator()) 
       { 
        while (enumerator.MoveNext()) 
        { 
         items.Add(enumerator.Current); 
        } 
       } 
      } 
     } 

     protected override void InsertItem(int index, T item) 
     { 
      base.InsertItem(index, item); 
      item.PropertyChanged += Item_PropertyChanged; 
     } 

     protected override void RemoveItem(int index) 
     { 
      Items[index].PropertyChanged -= Item_PropertyChanged; 
      base.RemoveItem(index); 
     } 

     protected virtual void MoveItem(int oldIndex, int newIndex) 
     { 
      T removedItem = this[oldIndex]; 
      base.RemoveItem(oldIndex); 
      base.InsertItem(newIndex, removedItem); 
     } 

     protected override void ClearItems() 
     { 
      foreach (T item in Items) 
      { 
       item.PropertyChanged -= Item_PropertyChanged; 
      } 
      base.ClearItems(); 
     } 

     protected override void SetItem(int index, T item) 
     { 
      T oldItem = Items[index]; 
      T newItem = item; 
      oldItem.PropertyChanged -= Item_PropertyChanged; 
      newItem.PropertyChanged += Item_PropertyChanged; 
      base.SetItem(index, item); 
     } 

     private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) 
     { 
      var handler = ItemPropertyChanged; 
      if (handler != null) { handler(sender, e); } 
     } 

     public event PropertyChangedEventHandler ItemPropertyChanged; 
    } 

Jetzt können Sie auf die PropertyChanged -Event der Elemente abonnieren in der Sammlung

+0

Vielen Dank für die Lösung – Master