2012-11-29 17 views
31

Nella mia app di Windows Store ho una lista popolata con ExpandoObjects. Dati funziona vincolanti fini per i valori iniziali, ma non per una proprietà di un'immagine Ho impostato asyncronously dopo che un file è stato scaricato:Associazione a ExpandoObject. PropertyChanged non funziona

public static async void Set<T>(this ExpandoObject thisObject, string property, Func<Task<T>> setter) { 
     var expando = thisObject as IDictionary<string, Object>; 

     if (!expando.ContainsKey(property)) { 
      expando.Add(property, null); 
     } 
     expando[property] = await setter.Invoke(); 
    } 

agganciando alla manifestazione PropertyChanged sul ExpandoObject conferma di essere licenziato per tutti gli oggetti. La nuova proprietà è associata all'oggetto e il valore è corretto, ma gli elementi in ListView non vengono aggiornati completamente.

L'elenco contiene 14 oggetti. Se utilizzo gli oggetti normali tipizzati invece di ExpandoObjects e utilizzo la stessa impostazione asincrona della proprietà dell'immagine, alcuni dei 14 oggetti vengono aggiornati nella vista (quelli attualmente non visibili). Se implemento INotifyPropertyChanged nella classe, tutti e 14 vengono aggiornati. Utilizzo di ExpandoObjects Ricevo il comportamento esatto come con gli oggetti digitati senza INPC: gli elementi non attualmente visibili vengono aggiornati.

Quindi sembra che PropertyChanged non funzioni con ExpandoObject e l'associazione dati.

Funziona come previsto in WPF, ma non in un'App Store. Vedi confronto: https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1

+0

PropertyChanged funziona in ExpandoObject, vedere un semplice esempio [qui] (http://pastebin.com/pyKCiGG4). Il problema deve essere qualcos'altro. Fornisci un esempio piccolo ma completo che riproduca questo comportamento. –

+5

Funziona come previsto in WPF, ma non in un'App Store. Controlla il mio semplice confronto: https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1 – user958578

+2

Ho presentato un errore di connessione: https://connect.microsoft.com/VisualStudio/feedback/ dettagli/836.252/windows-store-apps associazione dati-in-a-un--expandoobject-change-notification-non-lavoro –

risposta

1

Non hanno aggiunto un meccanismo predefinito per il collegamento a oggetti dinamici e invece ha aggiunto una nuova interfaccia ICustomTypeProvider. E quell'interfaccia non è stata aggiunta a ExpandoObject, ma con expando dovresti essere in grado di utilizzare il binding dell'indicizzatore poiché è uno IDictionary<string, object> che implementa INotifyPropertyChanged.

<TextBlock Text="{Binding [Foo]}"/> 
0

Andando su questo nuovo concludo che il legame non funziona per gli aggiornamenti degli attributi (quelli trattati con INotifyPropertyChanged) per WinRT/Win10 (Build 10240) quando si utilizza ExpandoObjects.

InotifyCollectionChanged funziona: gli elenchi di ExpandoObjects vengono aggiornati non appena vengono modificati, ma le loro proprietà non vengono collegate correttamente da Binding.

Una soluzione è quella di creare un oggetto di valore e tenere questo in ogni expandoobjectproperty:

public class ValueHolder : INotifyPropertyChanged 
{ 

    public ValueHolder(object v) 
    { 
    _value = v; 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 

    private object _value; 
    public object Value 
    { 
    get { return _value; } 
    set { 
     if (_value != value) 
     { 
     _value = value; 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs("Value")); 
     } 
     } 
    } 
    } 
} 

Posso quindi con successo legare e ottenere gli aggiornamenti da immobili a expandoobjects come questo:

<TextBlock Text='{Binding Path=Attribute1.Value }' MinWidth='20'/> 

assegno nuove proprietà come questa:

(theList[0] as dynamic).Attribute1 = new ValueHolder("a1"); 

I aggiornamento proprietà Così:

var listitem = (thelist[0] as dynamic); 
    listitem.Attribute1.Value = "UPDATE";