giovedì 9 settembre 2010

WPF - PropertyChanged is NULL (Part II) -> Implements IEquatable<>

Riprendendo il post “WPF - PropertyChanged is NULL” c’è da aggiungere che se si va in modifica di un oggetto, dopo aver caricato una maschera WPF (binding ad una proprietà di tipo Coupon) con all’interno alcuni controlli tra i quali anche un combo, non si riesce ad impostare il combo con il valore presente nella proprietà dell’oggetto.


In pratica il combo è binding alla proprietà CouponType dell’oggetto Coupon, CouponType a sua volta ha la proprietà impostata a “ValueFree” ma questa non viene visualizzata nel combo.

Il combo ha come ItemSource una lista (CouponTypes) di oggetti di tipo CouponType, il quale oggetto a sua volta implementa l’interfaccia INotifyPropertyChanged, quindi riepilogando:
public class Coupon : INotifyPropertyChanged

{

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propertyName)

{

if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

}



private CouponType _couponType;

/// <summary>

/// "CouponType": il tipo di coupon: Unspecified, Free, ValueFree, Fidelity, Serialized;

/// </summary>

public CouponType CouponType

{

get { return _couponType; }

set

{

if (value == _couponType) return;

_couponType = value;

OnPropertyChanged("CouponType");

}

}



}





public class CouponType : INotifyPropertyChanged

{

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propertyName)

{

if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

}



/// <summary>

/// Gets or sets the code.

/// </summary>

/// <value>The code.</value>

public CouponTypeEnum Code

{

get { return _code; }

set

{

if (value == _code) return;

_code = value;

OnPropertyChanged("Code");

}

}



/// <summary>

/// Gets or sets the description.

/// </summary>

/// <value>The description.</value>

public string Description

{

get { return _description; }

set

{

if (value == _description) return;

_description = value;

OnPropertyChanged("Description");

}

}



private CouponTypeEnum _code;

private string _description;

}

Bisogna quindi, per risolvere questa anomalia, implementare l’interfaccia IEquatable<CouponType> nell’oggetto CouponType nel seguente modo:
public class CouponType : INotifyPropertyChanged, IEquatable<CouponType>

{

#region IEquatable<CouponType> Membri di

bool IEquatable<CouponType>.Equals(CouponType other)

{

if (ReferenceEquals(null, other)) return false;

if (ReferenceEquals(this, other)) return true;

return Equals(other._code, _code) && Equals(other._description, _description);

}

public static bool operator ==(CouponType first, CouponType second)
{
return Equals(first, second);
}

public static bool operator !=(CouponType first, CouponType second)
{
return !Equals(first, second);
}
#endregion
}