2

アプリケーションを .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() );
}
4

0 に答える 0