だから私は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;
}