2016-07-21 13 views
1

現在、私は現在ユーザーのコレクションを持っています。コレクションを使用してItemsControlにCheckboxのデータ型を設定します。私はすべて選択コレクション内のアイテムのプロパティ変更の通知

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

私は思ったんだけどで最初の項目を移入どのように私はチェックボックスのいずれかがチェックされている場合、イベントが発生するようなイベントを作成しません。私はAnalysts.CollectionChanged += Analysts_CollectionChanged;を設定しようとしましたが、アイテムのプロパティではなく、文字通りコレクションが変更されない限り、それは本当に起きません。今、あなたは要素のPropertyChanged - イベントを購読することができ

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; 
    } 

:あなたはこのようなものを使用することをお勧めします

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> 

答えて

1

コレクション内

+0

ありがとうございます – Master

関連する問題