2017-02-03 1 views
0

J'ai besoin des données de l'élément de mise à jour en ListView natif.Mise à jour dans ListView Renderer

1. Utilisation de Xamarin.Forms ListView. simple DataItem modèle avec INotifyPropertyChanged:

List<DataItem> Data = new List<DataItem>(); 
    // ... fill Data 
    ListView listDevice = new ListView(); 
    listDevice.ItemsSource = Data; 
    listDevice.ItemTemplate = new DataTemplate(typeof(DataView)); 
    ... 
    void BtnTest_Clicked(object sender, EventArgs e) 
    { 
     Data[0].DeviceName = "Update OK"; 
    } 

Lorsque vous cliquez sur btnTest je vois "Mise à jour OK" dans le premier élément de ListView immédiatement. Tout va bien.

2. Utilisation de Renderer pour ListView. Im utilisant WorkingWithListviewNative par exemple, son a rendu et adaptateur. Im remplacer DataSource2 à DataItem modèle (partout) et ajouter même btnTest. La liste avec les données est visible, mais lorsque le bouton est cliqué, rien ne change. Je vois des changements après avoir fait défiler vers le haut et vers le haut.

Quel code dois-je ajouter à renderer (à OnElementPropertyChanged?) Ou à l'adaptateur?

Répondre

0

Au lieu de Liste, utilisez ObservableCollection et vous n'avez pas besoin de faire une notification de modification de propriété lors de son traitement.

+0

ObservableCollection mise à jour ListView (dans le premier exemple) uniquement lors de l'utilisation de Add, Remove, Insert et non lors de l'édition directe (Data [0] .ItemName = "..."). De cette façon, vous devez utiliser le hack sale (sauvegarder l'élément, le supprimer sous forme de DataSource, éditer l'élément sauvegardé, insérer l'élément sauvegardé dans DataSource) Quoi qu'il en soit, ObservableCollection ne fonctionne pas dans le second exemple (avec rendu personnalisé). Je pense qu'un code magique doit être ajouté au rendu ou à l'adaptateur. –

+0

Je suppose que vous pouvez implémenter INotifyCollectionChanged sur votre propre classe, mais je ne l'ai pas fait. – JOTN