2

私は最近、まだ機能していないように見えるMVVMのコツをつかもうと試み始めました。

モデル、ビュー、ビューモデルがあります。インターフェイスを使用する baseviewmodel が 1 つありINotifyPropertyChangedます。

ViewModelsすべてのビューでデータを使用できるように、自分のコレクションを作成したいと考えています。しかし、私はこれを進めることができないようです。

とにかく、たくさんの異なるものを読んだ後、何がどうあるべきかさえわかりません。

誰かが私に答えてくれることを願っている私の最大の問題は、私のコレクションをどこに捨てるViewModelsかということです。1 つを変更ViewModelしてView、別の場所で再度表示する必要があります。

public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public  BaseViewModel()
    {

    }

    protected virtual void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

これは、ViewModelあるビューで入力され、別のビューで表示する必要があるものです。ObservableCollection<T>しかし、クラスでこれを行う方法がわかりません。

public class WorkViewModel : BaseViewModel
{
    private string reference;
    private string address;
    private string scope;
    private string cost;
    private double amount;
    private double gst;
    private double total;

    public string Reference
    {
        get { return reference; }
        set
        {
            if (reference != value)
            { reference = value; RaisePropertyChanged("Reference"); }
        }
    }

    public string Address
    {
        get { return address; }
        set
        {
            if (address != value)
            { address = value; RaisePropertyChanged("Address"); }
        }
    }

    public string Scope
    {
        get { return scope; }
        set
        {
            if (scope != value)
            { scope = value; RaisePropertyChanged("Scope"); }
        }
    }

    public string Cost
    {
        get { return cost; }
        set
        {
            if (cost != value)
            { cost = value; RaisePropertyChanged("Cost"); }
        }
    }

    public double Amount
    {
        get { return amount; }
        set
        {
            if (amount != value)
            {
                amount = value;
                GST = Math.Round(amount * 0.10,2);
                RaisePropertyChanged("Amount");
            }
        }
    }

    public double GST
    {
        get { return gst; }
        set
        {
            if (gst != value)
            {
                gst = value;
                Total = Math.Round(Amount + GST,2);
                RaisePropertyChanged("GST");
            }
        }
    }

    public double Total
    {
        get { return total; }
        set
        {
            if (total != value)
            {
                total = value;
                RaisePropertyChanged("Total");
            }
        }
    }

}

私はこれを試しました:

"Create a BaseViewModel and a Collection ObservableCollection<BaseViewModel> _viewModels;

Create a Property ObservableCollection<BaseViewModel> ViewModels around _viewModels

Define your View Models like this and add to Collection

MainViewModel : BaseViewModel

Tab1ViewModel : BaseViewModel

Tab2ViewModel : BaseViewModel

これで次のように使用できます。

Tab1ViewModel vm = (ViewModels.Where(vm => vm is Tab1ViewModel).Count() == 0) ? new  Tab1ViewModel(): (ViewModels.Where(vm => vm is Tab1ViewModel).FirstOrDefault() as Tab1ViewModel;"

シングルトンを作る必要があるようですか?

4

1 に答える 1

2

ビュー モデルのコレクションをデザインのどこにでも保存する必要はありません。私の意見では、ビュー モデルはバッキング ソース (ほとんどの場合、モデル) からのデータを使用する必要があります。その設計では、同じタイプの 2 つのビュー モデルをインスタンス化できる必要があり、それらは同じ基になるデータを使用するため、両方とも同じデータを参照します。ビューごとに常に 1 つのビュー モデル インスタンスがあり、他のビュー モデルとは共有されません。

于 2013-01-07T10:08:26.387 に答える