Je n'ai pas implémenté ce modèle depuis un moment (et quand je l'ai fait c'était dans 2, par opposition à 3), et j'ai plusieurs exemples qui semblent tous simples, mais je ne peuvent pas travailler ce que je l'ai fait mal dans le morceau de code ci-dessous (les articles ne sont pas mis à jour lorsque l'événement se déclenche la propriété):Silverlight: INotifyPropertyChanged ne semble pas fonctionner
public partial class Index : Page
{
private IndexViewModel _vm;
public Index()
{
InitializeComponent();
_vm = new IndexViewModel(19);
this.TheDataGrid.ItemsSource = _vm.Rows;
}
public class IndexViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
this.PropertyChanged(this, e);
}
public SortableCollectionView Rows
{
get
{
return _rows;
}
set
{
if (_rows == value)
return;
_rows = value;
this.OnPropertyChanged(new PropertyChangedEventArgs("Rows"));
}
}
Cela ne rafraîchit pas mon DataGrid ... comme « hack » J'ai dû passer l'objet DataGrid dans mon viewmodel et de se lier là:
public IndexViewModel(int containerModelId, DataGrid shouldNotNeed)
{
ContainerModelId = containerModelId;
LoadOperation<vwColumn> headings = _ttasContext.Load(_ttasContext.GetRecordColumnsQuery(ContainerModelId));
headings.Completed += (sender2, e2) =>
{
//load data
LoadOperation<vwDataValue> data = _ttasContext.Load(_ttasContext.GetRecordsQuery(ContainerModelId, null));
data.Completed += (sender3, e3) =>
{
Rows = FormatData(data, headings);
shouldNotNeed.ItemsSource = Rows;
};
};
}
Je lis dans un autre poste quelque part que si vous aviez le délégué de = {} à la fin de la déclaration que vous ne l'avez pas besoin d'avoir le si (la propriété a changé! = Null) Cependant, même si c'est le cas où vous commentez que le code est moins clair, donc je l'ai changé, merci! –
@Grayson: Oui, il y a un certain avantage à cette astuce delegate {}, mais le modèle normal pour les événements en général est d'utiliser une méthode protégée virtuelle "OnXXXX" qui reçoit l'objet EventArgs approprié. Le problème avec cette approche pour INotifyPropertyChanged est que les valeurs de propriété peuvent changer rapidement (par exemple lors de l'animation). Cela pourrait provoquer la création d'une quantité massive d'instances de PropertyChangedEventArgs mais rien n'écoute, ce qui créerait une charge inutile pour le GC. – AnthonyWJones