0

コードに問題があります。リストボックスと監視可能なコレクションを使用して、データをリストに追加します。コードは次のようになります。

ListData actualData;
ObservableCollection<ListData> data;

public Calculate()
{
    InitializeComponent();

    data = new ObservableCollection<ListData>();
    newData();

    listbox1.ItemsSource = data;
}

private void newData()
{
    actualData = new ListData("1", "2", "3");
    data.Add(actualData);
}

これで、たとえば変更するボタンがありますがactualData、リストに変更が表示されません。

ボタンは次のようになります。

private void button1_Click(object sender, RoutedEventArgs e)
{
    actualData.first = "12";
}

回避策を見つけました:

listbox1.ItemsSource = null;
listbox1.ItemsSource = data;

しかし、これは良い解決策ではありません、ここで何が問題になっていますか?

4

2 に答える 2

4

ObservableCollectionは、リストにアクティビティがあり、リストのアイテムにはない場合にのみ通知します。リスト上のアクティビティとは、リスト内のアイテムを追加/削除することを意味します。ListDataクラスのプロパティ/メンバーの変更を通知するには、ListDataクラスにINotifyPropertyChangeインターフェイスを実装する必要があります。

于 2012-07-01T11:17:39.420 に答える
3

ZafarYousafiが彼の回答で正しく述べているように、ObservableCollection<T>追加および削除されたアイテムのリストのみを通知します。いずれかのアイテムのプロパティを変更しても、リスト内で更新されません。

ListData代わりに、次のようにクラスの定義を変更する必要があります。

public class ListData : INotifyPropertyChanged

PropertyChangedこれには、クラスがイベントを実装する必要があります。

public event PropertyChangedEventHandler PropertyChanged;

さて、あなたがする必要があるのはあなたの定義を変えることだけですfirst(コーディング規約はプロパティが大文字で始まるべきであると定めています、PascalCase):

private string first;
public string First
{
    get { return first; }
    set
    {
        first = value;
        var handler = PropertyChanged; //according to Essential C# (M. Michaelis) 
        if (handler != null)           //the copy should prevent threading issues
        {                              
            handler(this, new PropertyChangedEventArgs("First"));
        }
    }
}

ちなみに、プロパティ名を文字列として渡さないといけないのが気になります。より洗練されたソリューションについては、このチュートリアルを参照してください。

于 2012-07-01T11:34:50.893 に答える