2012-11-29 23 views
31

Trong ứng dụng Windows Store của tôi, tôi có một danh sách được điền bằng ExpandoObjects. công trình ràng buộc dữ liệu tốt cho các giá trị ban đầu, nhưng không phải cho một tài sản hình ảnh tôi đặt asyncronously sau một tập tin đã được tải về:Liên kết với ExpandoObject. PropertyChanged không hoạt động

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

Hooking lên đến sự kiện PropertyChanged trên ExpandoObject xác nhận rằng nó là bắn cho tất cả các đối tượng. Thuộc tính mới được gắn vào đối tượng và giá trị là chính xác, nhưng các mục trong ListView không được cập nhật đầy đủ.

Danh sách chứa 14 đối tượng. Nếu tôi sử dụng các đối tượng được gõ thường xuyên thay vì ExpandoObjects và sử dụng cùng một cài đặt không đồng bộ của thuộc tính hình ảnh, một số trong số 14 đối tượng được cập nhật trong dạng xem (đối tượng không hiển thị). Nếu tôi thực hiện INotifyPropertyChanged trong lớp, tất cả 14 được cập nhật. Sử dụng ExpandoObjects Tôi nhận được hành vi chính xác như với các đối tượng đã nhập không có INPC: các mục hiện không hiển thị được cập nhật.

Vì vậy, có vẻ như PropertyChanged không hoạt động với ExpandoObject và ràng buộc dữ liệu.

Nó hoạt động như dự định trong WPF, nhưng không phải trong một ứng dụng cửa hàng. Xem so sánh: https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1

+0

PropertyChanged works in ExpandoObject, xem mẫu đơn giản [here] (http://pastebin.com/pyKCiGG4). Vấn đề phải là cái gì đó khác. Vui lòng cung cấp một ví dụ nhỏ nhưng đầy đủ để tái tạo hành vi này. –

+5

Nó hoạt động như dự định trong WPF, nhưng không hoạt động trong một ứng dụng cửa hàng. Hãy xem so sánh đơn giản của tôi: https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1 – user958578

+2

Tôi đã gửi lỗi Kết nối: https://connect.microsoft.com/VisualStudio/feedback/ chi tiết/836252/databinding-in-windows-store-apps-to-an-expandoobject-thay đổi-thông báo-không hoạt động –

Trả lời

1

Họ không thêm cơ chế mặc định để ràng buộc với đối tượng động và thay vào đó thêm giao diện mới ICustomTypeProvider. Và giao diện đó chưa được thêm vào ExpandoObject, nhưng với expando, bạn sẽ có thể sử dụng liên kết chỉ mục vì nó là một IDictionary<string, object> thực hiện INotifyPropertyChanged.

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

Đi qua này một lần nữa tôi kết luận rằng ràng buộc không hoạt động để cập nhật thuộc tính (những người xử lý với INotifyPropertyChanged) cho WinRT/Win10 (Build 10240) khi sử dụng ExpandoObjects.

INotifyCollectionCông việc đã thay đổi - do đó danh sách ExpandoObjects được cập nhật khi chúng thay đổi - nhưng các thuộc tính của chúng không được nối chính xác bằng Ràng buộc.

Một workaround là để tạo ra một đối tượng giá trị và ghi nhớ điều này mỗi 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")); 
     } 
     } 
    } 
    } 
} 

tôi có thể sau đó thành công liên kết và nhận được thông tin cập nhật từ tài sản trong expandoobjects như thế này:

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

tôi gán các sản phẩm mới như sau:

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

Tôi cập nhật propertie s như thế này:

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