0

データベースからアイテムが取り込まれたリストボックスがあります。ここで、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 制約が真であることを確認したいからです。

4

2 に答える 2

0

財産の異動について届出が必要です。Framework 4.0 ではこの方法を試してください。

Mode=OneWayToSource,UpdateSourceTrigger=PropertyChanged

それが役に立てば幸い...

于 2013-11-06T06:48:18.687 に答える
0

コレクションの変更に関する通知が必要な場合は、OnPropertyChanged を呼び出します。

OnPropertyChanged("NameCollection")

あなたのビューモデル:

public class ViewModel: INotifyPropertyChanged
{
    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;
                OnPropertyChanged("NameCollection");
            }
        }
    }

    public void AddNewNameSecondWay(string s)
    {
       // your code
       OnPropertyChanged("NameCollection");
    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
       PropertyChangedEventHandler handler = PropertyChanged;
       if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
于 2013-11-06T07:52:43.087 に答える