0

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 として返します。

4

1 に答える 1