mvvm-light を使用していますが、RaisePropertyChanged に関するこの奇妙な動作に気付きました。
xaml:
<ListBox ItemsSource="{Binding Collection}"/>
<TextBlock Text="{Binding Text}"/>
観測可能なクラス:
public class A : ObservableObject
{
private string _b;
public string B
{
get { return this._b; }
set
{
this._b = value;
this.RaisePropertyChanged("B");
}
}
}
vm:
public MainViewModel(IDataService dataService) { this.Collection = new List<A>(...); }
public RelayCommand Command1
{
get
{
return this._command1 ?? (this._command1= new RelayCommand(() =>
{
this.Collection.Add(new A());
this.Collection[2].B = "updated";
this.RaisePropertyChanged("Collection");
this.RaisePropertyChanged("Text");
}));
}
}
public RelayCommand Command2
{
get { return this._command2?? (this._command2 = new RelayCommand(() => { this.Text++; })); }
}
public List<A> Collection { get; set; }
public int Text { get; set; }
したがって、RaisePropertyChanged("Collection") はバインディングを更新しませんが、RaisePropertyChanged("Text") は更新します。Command2 を数回実行し、その後 Command1 を実行するとわかります。Collection が ObservableCollection の場合、新しい要素はビューに表示されますが、更新されたアイテムは表示されません。つまり、ObservableCollection の内部メカニズムは機能しますが、RaisePropertyChanged は機能しません。