2016-08-21 53 views
2

來自Microsoft: 「BindingSource.ListChanged事件發生在底層列表更改或列表中的項目發生更改時」。BindingSource ListChanged事件觸發位置更改

但在我的例子中,事件觸發每個位置的變化。該表單有一個UserControl,一個BindingSource和一個按鈕。

用戶控制具有一個文本框和兩個屬性:當我結合使用的「文本」的控制

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

/// <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; } 
    } 

在表格上的按鈕改變的BindingSource的位置財產ListChanged事件不發生,符合市場預期:

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

但是當我使用「myProperty的」屬性ListChanged事件上的位置變化火災控件綁定:

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命名事件的對象。

現在看看你的用戶控件。首先,它不執行INotifyPropertyChanged。但是,事件,因此稱爲TextChanged,因此當您將數據綁定到Text屬性時,BindingSource將使用該事件觸發ListChanged。但是當綁定到MyProperty時,由於沒有事件調用MyPropertyChanged,因此當Position(因此當前對象)發生更改時,數據綁定基礎結構正在嘗試使用ListChanged事件來模擬它。

有了這樣說,以下內容添加到您的用戶控件:

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

和數據,預期結合,你的財產將正常工作。

+1

謝謝伊凡你的偉大答案! – Cristian