Abonneren op PropertyChanged op huidig ​​item in ViewModel

Is het een slechte gewoonte om je te abonneren op de PropertyChanged-gebeurtenis van de momenteel geselecteerde entiteit. Laten we zeggen dat ik een raster heb dat aan List is gebonden en ik heb Grid's SelectedItem gebonden aan de SelectedItem-eigenschap van ViewModel.

private Customer _selectedItem;
public Customer SelectedItem
{
    get {return _selectedItem;}
    set
    {
        if (!ReferenceEquals(_selectedItem, value))
        {
            _selectedItem = value;
            RaisePropertyChanged(()=>SeletedItem);
            _selectedItem.PropertyChanged += OnCustomerPropertyChanged;
        }
    }
}

Heeft deze code nadelen, prestaties, geheugenlekken, of is het veilig om het op deze manier te gebruiken?

1

1 antwoord

U lekt evenementenabonnementen. Er is niets mis met het idee om te binden aan SelectedItem, maar je moet onthouden om je later af te melden. Je moet ook je waarde null-checken voordat je je abonneert en je afmeldt:

private Customer _selectedItem;
public Customer SelectedItem
{
    get {return _selectedItem;}
    set
    {
        if (!ReferenceEquals(_selectedItem, value))
        {
            if (!ReferenceEquals(null, _selectedItem))
                _selectedItem.PropertyChanged -= OnCustomerPropertyChanged;
            _selectedItem = value;
            RaisePropertyChanged(()=>SelectedItem);
            if (!ReferenceEquals(null, _selectedItem))
                _selectedItem.PropertyChanged += OnCustomerPropertyChanged;
        }
    }
}

Anders, terwijl u door het selecteren van item na item gaat, zullen all van uw eerder geselecteerde items hun gebeurtenishandlers van PropertyChanged hebben gekoppeld aan OnCustomerPropertyChanged . Dat kan op zijn beurt leiden tot geheugenlekken (omdat gebeurtenishandlers kunnen voorkomen dat het gebeurtenisverhogende object GC'd wordt) of onverwacht gedrag.

3
toegevoegd