31

私の Windows ストア アプリには、ExpandoObjects が入力されたリストがあります。データ バインディングは初期値に対しては正常に機能しますが、ファイルのダウンロード後に非同期で設定した画像プロパティに対しては機能しません。

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 プロパティの同じ非同期設定を使用すると、14 個のオブジェクトの一部がビューで更新されます (現在表示されていないオブジェクト)。クラスに INotifyPropertyChanged を実装すると、14 個すべてが更新されます。ExpandoObjects を使用すると、INPC を使用しない型付きオブジェクトとまったく同じ動作が得られます。現在表示されていないアイテムが更新されます。

そのため、PropertyChanged は ExpandoObject とデータ バインディングで機能していないようです。

WPF では意図したとおりに機能しますが、ストア アプリでは機能しません。比較を見る: https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1

4

2 に答える 2

1

彼らは、動的オブジェクトにバインドするためのデフォルトのメカニズムを追加せず、代わりに新しいインターフェースを追加しましたICustomTypeProvider。また、そのインターフェイスは ExpandoObject にも追加されませんでしたが、expando を使用すると、IDictionary<string, object>を実装する であるため、インデクサー バインディングを使用できるはずですINotifyPropertyChanged

<TextBlock Text="{Binding [Foo]}"/>
于 2015-03-22T23:07:18.990 に答える