在我的Windows Store应用程序中,我有一个用ExpandoObjects填充的列表。数据绑定(bind)适用于初始值,但不适用于我在文件下载后异步设置的图像属性:

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并使用相同的image属性异步设置,则会在 View 中更新14个对象中的某些(当前不可见的对象)。如果我在该类中实现INotifyPropertyChanged,则所有14个都将更新。
使用ExpandoObjects,我可以获得与没有INPC的类型化对象完全相同的行为:当前不可见的项目已更新。

因此,似乎PropertyChanged无法与ExpandoObject和数据绑定(bind)一起使用。

它可以在WPF中正常工作,但不能在Store App中工作。查看比较:
https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1

最佳答案

他们没有添加绑定(bind)到动态对象的默认机制,而是添加了新接口(interface)ICustomTypeProvider。而且该接口(interface)也没有添加到ExpandoObject中,但是使用expando,您应该能够使用索引器绑定(bind),因为它是实现IDictionary<string, object>INotifyPropertyChanged

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

09-25 16:32
查看更多