Model-View-ViewModelのパフォーマンスの問題
-
05-07-2019 - |
質問
前回、モデルビュー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;
}
}
}
解決
アイテムのセットが大きい場合、 可視アイテムのみを保持したい ライブ。モデルを与えることでこれを行います 次の機能を有効化および無効化する ライブのタイミングを制御します。 (...)
リストボックスに何千ものモデルがあるとしましょう。ただの そのうちのいくつかを表示するだけです 一度に画面と私たちだけが欲しい 画面上のものがアクティブになります。します 添付プロパティのトリックを使用して カスタムを記述することなくこれ アクティブ化するたびにコーディングし、 モデルを非アクティブ化...
最近では、Bea Stollnitzがこの問題の解決策も提供していますこちら。 これがあなたのお役に立てば幸いです。
所属していません StackOverflow