データベースからアイテムが取り込まれたリストボックスがあります。ここで、Add 関数を呼び出すたびに新しい文字列値でリスト ボックスを更新したいと考えています。
私はこれを2つの方法で行いました。
新しい値をデータベースに追加し、リストボックスがバインドされている ViewModel クラスを更新しました。そして、これはうまくいきます。(以下の AddNewNameFirstWay メソッドを参照)
新しい値をデータベースに追加し、データベースから値を再読み込みして、ViewModel を更新しました。しかし、これはうまくいきません。(以下の AddNewNameSecondWay メソッドを参照)
これが私のViewModelコードです
public class ViewModel
{
private DBContext context = new DBContext("Data source=isostore:/names2.sdf");
private ObservableCollection<NameTable> nameCollection;
public ObservableCollection<NameTable> NameCollection
{
get
{
return nameCollection;
}
set
{
if (nameCollection != value)
{
nameCollection = value;
NotifyPropertyChanged();
}
}
}
public void AddNewNameSecondWay(string s)
{
NameTable t = new NameTable() { Name = s };
context.NameDatabaseTable.InsertOnSubmit(t);
context.SubmitChanges();
LoadFromDB();
}
public void AddNewNameFirstWay(string s)
{
NameTable t = new NameTable() { Name = s };
context.NameDatabaseTable.InsertOnSubmit(t);
context.SubmitChanges();
NameCollection.Add(t);
}
public void LoadFromDB()
{
var query = from i in context.NameDatabaseTable
select i;
NameCollection = new ObservableCollection<NameTable>(query);
}
private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName]string propertyName = null)
{
var tmp = PropertyChanged;
if (tmp != null)
tmp(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
これが私のXAMLバインディングコードです
<ListBox ItemsSource="{Binding NameCollection, Mode=OneWay}" >
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name, Mode=OneWay}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
ObservableCollection メモリ参照が変更されるため、2 番目の方法は機能しないようです。これが正しい場合、バインディングを適切に更新する方法は?
2 番目の方法を使用する理由は、挿入する値に対してすべての DB 制約が真であることを確認したいからです。