質問

前回、モデルビューViewModel の実装を開始して、WPFを簡単に操作できるようにしました。 それはエレガントだと言わざるを得ませんが、私が注意しなければならないことが一つあります。 MVVMを使用しているときに、パフォーマンスの問題に気づきました。

元のオブジェクトを" Viewable "にラップします。多くのアイテムの場合、オブジェクトは高価になる可能性があります。 最近、約2万のアイテムを含むListViewを作成しました。ビューの作成には数秒かかりました。 私は間違ったことをしませんか、それはかなり論理的です。もしそうなら、この問題を解決する方法?

私のサンプルコード:

public class AdresseVm : INotifyPropertyChanged
    {        
        public AdresseVm(Adresse adresse)
        {
            this.adresse = adresse;
        }

        private bool isChecked;
        public bool IsChecked
        {
            get { return isChecked; }
            set
            {
                isChecked = value;
                OnPropertyChanged("IsChecked");
            }
        }

        private Adresse adresse;
        public Adresse Adresse
        {
            get { return adresse; }
            set
            {
                adresse = value;
                OnPropertyChanged("Adresse");
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion
    }

およびメインオブジェクト:

public class AdressenVm
    {
        private IEnumerable<Adresse> adressen;
        private ObservableCollection<AdresseVm> adressenListVm = new ObservableCollection<AdresseVm>();

        public AdressenVm(IEnumerable<Adresse> adressen)
        {
            this.adressen = adressen;

            foreach (Adresse adresse in adressen)
                adressenListVm.Add(new AdresseVm(adresse));
        }

        public ObservableCollection<AdresseVm> AdressenListVm
        {
            get { return adressenListVm; }
            set { adressenListVm = value; }
        }

        public IEnumerable<Adresse> CheckedAdresses
        {
            get
            {
                foreach (AdresseVm a in adressenListVm)                
                    if (a.IsChecked) yield return a.Adresse;                
            }
        }
    }
役に立ちましたか?

解決

MVVMに関するシリーズのパート6 (MVVMの最初の登場の1つであり、DM-V-VMと呼びます...)このトピックに触れます:

  

アイテムのセットが大きい場合、   可視アイテムのみを保持したい   ライブ。モデルを与えることでこれを行います   次の機能を有効化および無効化する   ライブのタイミングを制御します。 (...)

     

リストボックスに何千ものモデルがあるとしましょう。ただの   そのうちのいくつかを表示するだけです   一度に画面と私たちだけが欲しい   画面上のものがアクティブになります。します   添付プロパティのトリックを使用して   カスタムを記述することなくこれ   アクティブ化するたびにコーディングし、   モデルを非アクティブ化...

最近では、Bea Stollnitzがこの問題の解決策も提供していますこちら。 これがあなたのお役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top