2012-11-29 52 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";