アプリケーションを .Net Framework 3.5 から 4.0 にアップグレードしていますが、BindingSource の動作に変更がありました。
コード:
bindingSource.DataSource = new Dictionary<int, int>( 0 );
.Net Framework 3.5 では、PositionChanged イベントは発行されません。ただし、.Net Framework 4.n に対してコンパイルすると、起動されます。PositionChanged イベントで現在の項目をチェックすると、ディクショナリ自体が保持されます。
これは .Net Framework 4.n のバグですか? 以下は、動作を強調するいくつかのテストです。
[TestMethod]
public void FW40_WhenBindingToEmptyCollectionThenPositionChangedIsInvoked() {
Dictionary<int, int> emptyCollection = new Dictionary<int, int>( 0 );
BindingSource bindingSource = new BindingSource();
object currentItem = null;
bindingSource.PositionChanged += ( sender, e ) => {
currentItem = ( (BindingSource)sender ).CurrencyManager.Current;
};
bindingSource.DataSource = emptyCollection;
Assert.AreEqual<Type>( typeof( Dictionary<int, int> ), currentItem.GetType() );
}
[TestMethod]
public void FW35_WhenBindingToEmptyCollectionThenPositionChangedIsNotInvoked() {
Dictionary<int, int> emptyCollection = new Dictionary<int, int>( 0 );
BindingSource bindingSource = new BindingSource();
object currentItem = null;
bindingSource.PositionChanged += ( sender, e ) => {
currentItem = ( (BindingSource)sender ).CurrencyManager.Current;
};
bindingSource.DataSource = emptyCollection;
Assert.IsNull( currentItem );
}
[TestMethod]
public void FWAll_WhenBindingToNonEmptyCollectionThenPositionChangedIsInvokedAndCurrentItemIsKeyValuePair() {
Dictionary<int, int> noneEmptyCollection = new Dictionary<int, int> { { 1, 1 } };
BindingSource bindingSource = new BindingSource();
object currentItem = null;
bindingSource.PositionChanged += ( sender, e ) => {
currentItem = ( (BindingSource)sender ).CurrencyManager.Current;
};
bindingSource.DataSource = noneEmptyCollection;
Assert.AreEqual<Type>( typeof( KeyValuePair<int, int> ), currentItem.GetType() );
}