2016-02-26 59 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 )从UI更改应该引发事件PropertyChanged,但此事件为空。

(列表框在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不注册并为空,当我通过使用通用列表创建集合事件工作正常? 感谢您的回答。

回答

3

您需要实现enumerable。使用您当前的代码,每次枚举枚举时都会运行foreach循环,每次创建新的对象ExportSetting

修复:

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

通知应该是正确的,因为当我使用列表进行收集时,它会起作用。 – David

+0

这是不正确的。 “SequencesToExport”不是“Export”属性的类的属性。 –