3

モデルクラスがあり、それDataを作成したいとしDataViewModelますDataView。データクラスは次のようになります。

public class Data
{
    public Data()
    {
        RandomData = new List<String>();
    }

    public List<String> RandomData {get; set;}
}

DataViewModelプロパティをカプセル化するものを作成したいと思いRandomDataます。RandomData一部のプロパティにバインドしてListView、基になるモデルがRandomData変更されたときに更新する必要があります。

私がこれを行う場合:

public class DataViewModel
{
    private Data _data;

    public DataViewModel(Data data)
    {
        _data = data;
        RandomData = new ObservableCollection<String>(_data.RandomData);
    }

    public ObservableCollection<String> RandomData {get; set;}
}

その後、更新を受け取りません。(私はそれがリストをコピーしているだけであることを知っています、私はそれを使って要点を伝えます)。プロパティでINotifyPropertyChangedを使用した場合RandomData、新しいリストが割り当てられたという通知のみを受け取ります。代わりに内容の変更を確認するにはどうすればよいですか?これを行うための好ましい方法は何ですか?

提案ありがとうございます

4

3 に答える 3

3

この特定の例では、ObservableCollectionを使用するようにモデルを変更したくなるでしょう。

public class Data
{
    public Data()
    {
        RandomData = new ObservableCollection<String>();
    }

    public ObservableCollection<String> RandomData {get; set;}
}

次に、これをビューモデルでReadOnlyObservableCollectionとして公開します。ReadOnlyObservableCollectionは、元のObservableCollectionのラッパーであることに注意してください。データはコピーされず、元のコレクションからの変更通知はReadOnlyObservableCollectionに反映されます。

public class DataViewModel
{
    public DataViewModel(Data data)
    {
        RandomData = new ReadOnlyObservableCollection<String>(data.RandomData);
    }

    public ReadOnlyObservableCollection<String> RandomData {get; private set;}
}

これは、もちろん、ビューモデルのRandomDataを読み取り専用にすることを前提としています。

于 2013-03-21T08:53:58.223 に答える
1

INotifyCollectionChangedを使用する既存のコレクションの変更に注意する必要があります。

http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx

このインターフェースを実装することは、使用するのに良い方法かもしれません。ただし、MSDNのMVVMモデルの記事http://msdn.microsoft.com/en-us/magazine/dd419663.aspxを信じていますが、JoshSmithはこのインターフェイスを使用せずにこれを実行します。彼が与えた例では、次のようなロジックで顧客をコレクションに追加していることを知っています。

void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.NewItems != null && e.NewItems.Count != 0)
                foreach (CustomerViewModel custVM in e.NewItems)
                    custVM.PropertyChanged += this.OnCustomerViewModelPropertyChanged;

            if (e.OldItems != null && e.OldItems.Count != 0)
                foreach (CustomerViewModel custVM in e.OldItems)
                    custVM.PropertyChanged -= this.OnCustomerViewModelPropertyChanged;
        }
于 2013-03-20T17:42:41.153 に答える
0

オプション1(MVVMは少し脇にありますが、機能します)。これをビューコードビハインドのOnNagivatedToに追加すると、いつでもデータが更新されます。

protected override void OnNavigatedTo(NavigationEventArgs e) {
this.DataContext = new YourViewModel();
}

オプション2:

 raise RaisePropertyChanged(YourItem);
于 2013-04-02T14:17:16.770 に答える