2016-02-26 7 views
0

Почему не работает следующий код?Событие PropertyChanged не работает с коллекцией, созданной с помощью урона

У меня есть этот класс:

public class ExportSetting : INotifyPropertyChanged 
{ 
    public Guid Guid { get; set; } 
    public string Name { get; set; } 
    private bool export; 

    public bool Export 
    { 
     get { return export; } 
     set 
     { 
      export = value; 
      NotifyPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void NotifyPropertyChanged([CallerMemberName]string propertyName = null) 
    { 
     if (!string.IsNullOrEmpty(propertyName) && PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

И я создал коллекцию с помощью команды выхода:

public IEnumerable<ExportSetting> SequencesToExport 
    { 
     get { return sequencesToExport; } 
     set { sequencesToExport = value; } 
    } 

...

sequencesToExport = FillSequencesSetting(sequences); 

    private IEnumerable<ExportSetting> FillSequencesSetting(List<MTFSequence> sequences) 
    { 
     foreach (var item in sequences) 
     { 
      yield return new ExportSetting(item.Id, item.Name, true); 
     } 
    } 

Когда свойство экспорта (из класса ExportSetting) изменен из пользовательского интерфейса, следует поднять событие PropertyChanged, но это событие равно null.

(ListBox в XAML имеет ItemsSource привязку к собственности SequenceToExport)

Когда я изменил создание коллекции, как это все работает правильно:

private IEnumerable<ExportSetting> FillSequencesSetting(List<MTFSequence> sequences) 
    { 
     List<ExportSetting> tmp = new List<ExportSetting>(); 
     foreach (var item in sequences) 
     { 
      tmp.Add(new ExportSetting(item.Id, item.Name, true)); 
     } 
     return tmp; 
    } 

Почему выход команды вызывает событие PropertyChanged не является зарегистрирован и имеет значение null, а когда я создаю коллекцию с помощью общего списка, событие работает правильно? Спасибо за ваши ответы.

ответ

3

Необходимо материализовать перечислимое количество. С вашим текущим кодом цикл foreach запускается каждый раз, когда перечисляемый перечислит, создавая новые объекты ExportSetting каждый раз.

Fix:

sequencesToExport = FillSequencesSetting(sequences).ToArray(); 

Или:

sequencesToExport = FillSequencesSetting(sequences); 

private IEnumerable<ExportSetting> FillSequencesSetting(List<MTFSequence> sequences) 
{ 
    return sequences.Select(x => new ExportSetting(x.Id, x.Name, true)).ToArray(); 
} 
+0

Спасибо! Я использовал первое решение, и оно работает! – David

0

Вы пропустите уведомление, когда SequencesToExport свойство изменяется:

public bool Export 
{ 
    get { return export; } 
    set 
    { 
     export = value; 
     NotifyPropertyChanged(); 
     NotifyPropertyChanged(nameof(SequencesToExport)); 
    } 
} 
+0

Уведомление должно быть правильным, потому что, когда я использую List для коллекции, он работает. – David

+0

Неправильно. 'SequencesToExport' не является свойством класса, для которого' Export' является свойством. –

 Смежные вопросы

  • Нет связанных вопросов^_^