0

だから私は3つのことがあります:

  • ウィンドウ内のリストボックス
  • ObservableList へのアクセスを許可する DataBase クラス
  • 連絡先は INotifyChanged を実装します

私のメイン ウィンドウには、3 つのボタンがあります (1 つは新しいリスト エントリ用、もう 1 つは編集用、もう 1 つはアイテムの削除用です)。

私は次のようにリストを埋めます:

lbKontakte.ItemsSource = DB.GetInstance().Kontakte;

一方、Kontakte は ObservableCollection です

を使用して新しいエントリを作成できます

DB.GetInstance().Kontakte.Add(New Kontakt(...));

またはを使用してエントリを削除します

DB.GetInstance().Kontakte.Remove(...);

Boh アクションはすぐに ListBox に表示されます。

ただし、値を変更すると、コードは使用されません。連絡先の Name フィールドにバインドされた TextBox があります。それに変更を加えた場合、理論的には、バインドされた Contact オブジェクトに対してすぐに変更を実行する必要があります。

ただし、テキストを変更しても、変更は ListBox に表示されません。コードを一時停止してオブジェクトを確認すると、名前フィールドが正しく変更されていることがわかります。

ListBox が更新されないのはなぜですか?

PS: Contact は、次のコードを使用して INotifyChanged を実装します。

public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, e);
        }
    }

public String Name
    {
        get { return _name; }
        set { _name = value; OnPropertyChanged(new PropertyChangedEventArgs("Name")); }
    }

編集: テキスト ボックスはメイン ウィンドウの一部ではありませんが、ユーザーが編集ボタンをクリックするとウィンドウがダイアログとして表示されます。Window には、Constructor で Kontakt としてキャストされた selectedItem が与えられます。次のようにフィールドにバインドします。

<TextBox Name="txtName" Grid.Column="1" Grid.Row="0" Margin="4" Text="{Binding Path=Name}"></TextBox>

public KontaktAddUI(Kontakt kontaktToEdit)
    {
        InitializeComponent();
        this.kontaktToEdit = kontaktToEdit;
        this.MainGrid.DataContext = kontaktToEdit;
    }

コメントの正解、ありがとう!

4

1 に答える 1

1

既知の問題であるアイテム プロパティが変更された場合、問題はObservableCollection通知されません。
この問題を解決するINotifyPropertyChangedには、CollectionChangedイベントをObservableCollection

ここで、それを行う方法の例を見ることができます。

于 2013-03-22T11:12:09.120 に答える