2016-08-21 13 views
2

Microsoftから: "BindingSource.ListChangedイベントは、基になるリストが変更されたとき、またはリストの項目が変更されたときに発生します"。BindingSource ListChangedイベントが位置変更で発生する

私の例では、イベントはすべての位置変更で発生します。フォームには、UserControl、BindingSource、Buttonがあります。

ユーザーコントロールが有するもののTextBoxと二つの特性:私は「テキスト」を使用してコントロールをバインドする場合

void next_Click(object sender, EventArgs e) 
{ 
    bindingsource.Position += 1; 
} 

:フォーム上のボタンのBindingSourceの位置を変更

/// <summary> 
    /// Is working: ListChanged is not fired 
    /// </summary> 
    public override string Text 
    { 
     get { return textBox1.Text; } 
     set { textBox1.Text = value; } 
    } 

    /// <summary> 
    /// Is not working: ListChanged is fired on Position changes 
    /// </summary> 
    public string MyProperty 
    { 
     get { return textBox1.Text; } 
     set { textBox1.Text = value; } 
    } 

ListChangedイベントは期待どおりに発生しません。

myusercontrol1.DataBindings.Add("Text", bindingsource, "name"); 

私は位置の変更にListChangedイベントが発生し、「MYPROPERTY」プロパティを使用してコントロールをバインド:

myusercontrol1.DataBindings.Add("MyProperty", bindingsource, "name"); 

私は、この例のように異なるDataSorcesを、試してみました:

public Example() 
{ 
    InitializeComponent(); 

    string xml = @"<states>" 
     + @"<state><name>Washington</name></state>" 
     + @"<state><name>Oregon</name></state>" 
     + @"<state><name>Florida</name></state>" 
     + @"</states>"; 
    byte[] xmlBytes = Encoding.UTF8.GetBytes(xml); 
    MemoryStream stream = new MemoryStream(xmlBytes, false); 
    DataSet set = new DataSet(); 
    set.ReadXml(stream); 

    bindingsource.DataSource = set; 
    bindingsource.DataMember = "state"; 
    bindingsource.ListChanged += BindingNavigator_ListChanged; 

    myusercontrol1.DataBindings.Add("MyProperty", bindingsource, "name"); 
} 

どのように私はMYPROPERTYを使用してListChangedを回避することができますポジションの変更でイベントが発生しますか?なぜTextプロパティが期待どおりに機能していますが、MyPropertyは機能していませんか?予想通り、事前に

おかげで、 クリスティアン

答えて

1

はなぜテキストプロパティは機能していますが、MYPROPERTYはないですか?

変更に関する通知はすべてです。ご存知のとおり、Windowsフォームのデータバインディングは、INotifyPropertyChangedを実装するオブジェクトまたは名前付きイベント{PropertyName}Changedを提供するオブジェクトの2種類のソースオブジェクト変更通知をサポートしています。

あなたのユーザーコントロールを見てください。まず、INotifyPropertyChangedを実装していません。ただし、というイベントで、Textプロパティにデータをバインドすると、BindingSourceはそのイベントを使用してListChangedを呼び出します。しかし、MyPropertyにバインドすると、MyPropertyChangedというイベントがないので、データバインディングインフラストラクチャはPosition(したがって現在のオブジェクト)が変更されたときにListChangedイベントでエミュレートしようとしています。それはあなたのユーザーコントロールに以下を追加し、言われていると

:期待通りにあなたの財産に結合

public event EventHandler MyPropertyChanged 
{ 
    add { textBox1.TextChanged += value; } 
    remove { textBox1.TextChanged -= value; } 
} 

とデータが動作します。

+1

あなたの偉大な答えはイワンです! – Cristian

関連する問題