2012-11-29 13 views
31

मेरे विंडोज स्टोर ऐप में मेरे पास 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(); 
    } 

Hooking ExpandoObject पर PropertyChanged घटना अप करने के लिए पुष्टि की है कि यह सभी वस्तुओं के लिए निकाल दिया गया है। नई संपत्ति ऑब्जेक्ट से जुड़ी है और मान सही है, लेकिन ListView में आइटम पूर्ण रूप से अपडेट नहीं किए गए हैं।

सूची में 14 ऑब्जेक्ट्स हैं। यदि मैं ExpandoObjects की बजाय नियमित टाइप की गई वस्तुओं का उपयोग करता हूं और छवि प्रॉपर्टी की समान एसिंक सेटिंग का उपयोग करता हूं, तो 14 में से कुछ ऑब्जेक्ट दृश्य में अपडेट हो जाते हैं (जो वर्तमान में दिखाई नहीं दे रहे हैं)। यदि मैं कक्षा में बदलकर INotifyProperty को लागू करता हूं तो सभी 14 अपडेट हो जाते हैं। ExpandoObjects का उपयोग करके मुझे टाइप किए गए ऑब्जेक्ट्स के साथ आईएनपीसी के बिना सटीक व्यवहार मिलता है: वर्तमान में दिखाई नहीं दे रहे आइटम अपडेट किए गए हैं।

तो ऐसा लगता है कि PropertyChanged ExpandoObject और डेटा बाइंडिंग के साथ काम नहीं कर रहा है।

यह WPF में इच्छित कार्य करता है, लेकिन स्टोर ऐप में नहीं। तुलना देखें: https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1

+0

PropertyChanged ExpandoObject में काम करता है, सरल नमूना [यहां] को देखने के (http://pastebin.com/pyKCiGG4)। समस्या कुछ और होना चाहिए। कृपया एक छोटा लेकिन पूरा उदाहरण प्रदान करें जो इस व्यवहार को पुन: उत्पन्न करता है। –

+5

यह WPF में लक्षित के रूप में काम करता है, लेकिन स्टोर ऐप में नहीं। मेरी सरल तुलना देखें: https://sites.google.com/site/moramatte/ExpandoComparison.zip?attredirects=0&d=1 – user958578

+2

मैंने कनेक्ट बग दायर किया: https://connect.microsoft.com/VisualStudio/feedback/ विवरण/836,252/बाइंडिंग-इन-windows-दुकान-क्षुधा करने वाली एक-expandoobject-परिवर्तन-सूचना देने वाला नहीं काम –

उत्तर

1

उन्होंने गतिशील वस्तुओं को बाध्य करने के लिए एक डिफ़ॉल्ट तंत्र नहीं जोड़ा और इसके बजाय एक नया इंटरफ़ेस ICustomTypeProvider जोड़ा। और वह इंटरफ़ेस किसी भी ExpandoObject में जोड़ा नहीं गया था, लेकिन विस्तार के साथ आप इंडेक्सर बाइंडिंग का उपयोग करने में सक्षम होना चाहिए क्योंकि यह IDictionary<string, object> है जो INotifyPropertyChanged लागू करता है।

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

इस पर जा रहे हैं फिर मैं निष्कर्ष है कि बंधन (बिल्ड 10240) WinRT/Win10 के लिए विशेषता अद्यतन (लोगों INotifyPropertyChanged के साथ संभाला) के लिए काम नहीं कर रहा है जब 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"); 

मैं संपत्ति अद्यतन करता हूं इस तरह रों:

var listitem = (thelist[0] as dynamic); 
    listitem.Attribute1.Value = "UPDATE"; 
संबंधित मुद्दे