WPF に ComboBox があり、ItemsSource プロパティを String の IEnumerable を返すプロパティにバインドしています。バインディングは一方通行です。ComboBox のデータを含むクラスは INotifyPropertyChanged インターフェイスを実装し、プロパティが更新されるとすぐに OnPropertyChanged(..) を呼び出します。ComboBox をそのままにしておくと、変更が正しく反映されます。ただし、ComboBox が一度展開されるか、値が選択されるとすぐに、ItemsSource コレクションの変更は更新されなくなります。この動作の理由は何ですか?
XAML はこちら
<ComboBox Name="cmbSourceNames"
Grid.Row="0"
SelectedItem="{Binding Path=CurrentSource, UpdateSourceTrigger=PropertyChanged}"
ItemsSource="{Binding Path=SourceAddresses, NotifyOnSourceUpdated=True}"/>
DataContext はコード ビハインドで設定されます。
this.cmbSourceNames.DataContext = this._dpa;
そして、これがプロパティの変更をトリガーするメソッドです。パケットを追加するメソッドは、BeginInvoke を使用して Current Dispatcher に委任されます。
private void DispatcherAddDataPacket(DataPacket dp)
{
ObservableCollection<DataPacket> dpList;
this._dpkts.TryGetValue(dp.SourceAddress, out dpList);
if (dpList == null)
{
dpList = new ObservableCollection<DataPacket>();
dpList.Add(dp);
this._dpkts.Add(dp.SourceAddress, dpList);
OnPropertyChanged("SourceAddresses");
}
else
{
dpList.Add(dp);
}
}
プロパティは、ディクショナリのキーを IEnumerable として返します。