2012-11-29 113 views
31

在我的Windows應用商店應用程序中,我有一個用ExpandoObjects填充的列表。精爲初始值,但不適合我asyncronously設置文件下載後的圖像屬性的數據綁定的工作方式:綁定到ExpandoObject。 PropertyChanged不起作用

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(); 
    } 

掛鉤對ExpandoObject PropertyChanged事件證明了它是爲所有對象解僱。 新屬性附加到對象並且值是正確的,但ListView中的項目未完全更新。

該列表包含14個對象。如果我使用常規類型對象而不是ExpandoObjects並使用圖像屬性的同一異步設置,則14個對象中的一些會在視圖中更新(當前不可見)。如果我在類中實現了INotifyPropertyChanged,則所有14都會更新。 使用ExpandoObjects我得到了與沒有INPC的類型對象一樣的確切行爲:更新當前不可見的項目。

所以看來PropertyChanged不能與ExpandoObject和數據綁定一起工作。

它在WPF中按預期運行,但不在Store應用程序中運行。見比較: https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1

+0

PropertyChanged在ExpandoObject中工作,看簡單示例[這裏](http://pastebin.com/pyKCiGG4)。問題一定是別的。請提供一個小而完整的例子來重現這種行爲。 –

+5

它在WPF中按預期運行,但不在Store應用程序中運行。看看我的簡單比較:https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1 – user958578

+2

我提交了一個連接錯誤:https://connect.microsoft.com/VisualStudio/feedback/細節/ 836252 /數據綁定功能於Windows的商店的應用程序到一個-expandoobject變更通知 - 不工作 –

回答

1

他們沒有添加綁定到動態對象的默認機制,而是添加了一個新的接口ICustomTypeProvider。並且該接口也未添加到ExpandoObject中,但使用expando時,您應該能夠使用索引器綁定,因爲它是實現INotifyPropertyChangedIDictionary<string, object>

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

去在這一次我的結論是綁定不是屬性的更新(與INotifyPropertyChanged的處理的那些)的WinRT中/ Win10工作(建設10240)使用ExpandoObjects時。

INotifyCollectionChanged工作 - 所以ExpandoObjects的列表隨着它們的更改而更新 - 但它們的屬性沒有通過綁定正確地連接。

一種解決方法是創建一個值對象,並保持這種在每個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")); 
     } 
     } 
    } 
    } 
} 

我可以再綁定成功,並從性能更新在expandoobjects這樣的:

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

我分配像這樣的新屬性:

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

我更新了屬性s是這樣的:

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