1

私がまとめている WPF/MVVM アプリに関するちょっとしたガイダンスを探しています。今日、Google は私を助けてくれませんでした。

したがって、他のモデルをプロパティとして持ついくつかのモデル(ドメインオブジェクト)を持つアプリケーションがあります。現時点では、ネストされたオブジェクトを平坦化し、それを含むオブジェクトの ViewModel でプロパティを公開しています。

私のモデルがより複雑になるにつれて、ViewModels をいくらか分解する方法に苦労しています。私は「複合ビュー」に向かっています。「包含」オブジェクトにはViewとViewModelがあり、「ネストされた」オブジェクトにも独自のものがあります。これにより、再利用可能なコードも得られます。これはプラスになります。

非常に単純な例として、建物があり、各建物にはいくつかのプロパティがあり、次のような住所があるとします。

public class Building
{
     public string Name { get; set;}
     public Address Address { get; set;}
}

public class Address
{
    public string Number { get; set; }
    public string Street { get; set; }
}

次に、建物用の ViewModel と、住所用の ViewModel (BuildingViewModel によって公開される) があります。

public class BuildingViewModel
{
    public string Name { get; set; } // from model
    public AddressViewModel Address { get; set; } // a wrapped instance of Address
    // INPC, etc... 
}

public class AddressViewModel
{
    public string Number { get; set; } // originally from Building 
    public string Street { get; set; }
    // INPC, etc...
}

したがって、示されていませんが、BuildingView とネストされた AddressView があります。最初にデータ テンプレートで ViewModel を使用しているだけです。

では、Address オブジェクトの同期を維持するにはどうすればよいでしょうか。これらを 2 つの ViewModel に分割するとすぐに、Address オブジェクトの 2 つのインスタンスが得られます。私が行ったすべての検索で、オブジェクトをやり取りするメッセージを使用しているのを見てきました。「オブザーバー」パターンが言及されています。

私は正しい方向に向かっていますか、それとも本当に単純なものが欠けていますか? 任意の提案をいただければ幸いです。

FWIW、私は学習曲線に不安を感じていたので、自分のフレームワークをまとめました。さらに、これまではかなり単純でした。

4

2 に答える 2

1

あなたの現在の方向性はあまりにも多くの情報を公開していて、モデルとビューモデルが緩く結合されるのを妨げていると思います。

すべてのデータ(建物と住所)をカプセル化するモデルのインスタンスは1つだけです。すべてのビューモデルは、静的メソッドを介してこの1つのインスタンスを取得します。

次に、データベースに問い合わせたモデルのクエリメソッドを公開します。たとえば、ビューに入力できる結果のリストを返します。

リストは建物やアドレスのリストである必要はないことに注意してください。各リストアイテムには、ビューモデルに最も役立つものがすべて含まれます。たとえば、建物の一部のフィールドや、ネストされたアドレスレコードのフィールドなどです。

ちなみに、Wpfには、ビューモデルがビューについて何も知る必要なしに、ビューモデルデータをビューに直接リンクするための優れたメカニズムがあります。たとえば、リストボックスを使用したクエリ結果です。

于 2012-08-03T05:19:10.760 に答える
1

アドレス型のバックエンド フィールドを使用して、AddressViewModel にアドレスを格納できます。

    public class AddressViewModel
    {
        private readonly Address _address;

        public AddressViewModel(Address address)
        {
            _address = address;
        }

        public string Number 
        { 
            get { return _address.Number; }
            set { _adress.Number = value; }
        }
        public string Street
        { 
            get { return _address.Street; }
            set { _adress.Street = value; }
        }
    }

私のコードで何かできることを願っています:-)

編集:

次の試み:)

問題を解決する最善の方法は、モデルを取得するファクトリ クラス/メソッドを使用することだと思います。たとえば、メソッド GetAddressList() を持つ AddessList クラスがあるとします。このメソッドは、Address モデル オブジェクトのリストを返します。最初の呼び出しの後、返されたオブジェクトを AddressList クラスにキャッシュし、次の呼び出しではキャッシュされたリストを返します。

    public static class AddressList
    {
        private static List<Address> _backend;

        private static AddressList()
        {
            _backend = new List<Address>();
        }

        public static List<Address> GetAddressList()
        {
            if(_backend.Count == 0)
            {
                //Here you can load your models from your data source
            }
            else
            {
                return _backend;
            }
        }
    }
于 2012-08-03T09:07:57.687 に答える