2011-08-12 18 views
10

मैं एक ऐप बना रहा हूं जिसमें वस्तुओं की एक सूची को नियंत्रण के समूह पर प्रदर्शित होने से पहले अवरुद्ध और अनुवाद किया जाना चाहिए। इस अंत में, मैंने ऑब्जेर्जेबल कोलेक्शन (बैकअपअप एक डेटाबेस के बारे में एक कस्टम क्लास परिभाषित जानकारी होने के नाते) की निर्भरता प्रॉपर्टी बनाई है। मैं जो करना चाहता हूं वह यह है कि नियंत्रण एक एमवीवीएम में एक अवलोकन करने योग्य चयन के लिए बाध्य होगा। इस संग्रह का उपयोग शुरू में नियंत्रण को लोड करने के लिए किया जा सकता था। फिर, जब नियंत्रण इंटरफ़ेस के माध्यम से एक प्रविष्टि जोड़ा जाता है, तो उसे आंतरिक पर्यवेक्षण चयन में जोड़ा जाना चाहिए जिसे निर्भरता प्रॉपर्टी के रूप में परिभाषित किया गया है और एमवीवीएम में संग्रह में दिखाए जाने के बाद से वे बाध्य हैं।निर्भरता के रूप में अवलोकन करने योग्य चयन

protected ObservableCollection<BackupEntry> _BackupItems = new ObservableCollection<BackupEntry>(); 

public static readonly DependencyProperty BackupItemsProperty = DependencyProperty.Register("BackupItems", typeof(ObservableCollection<BackupEntry>), typeof(ExplorerWindow)); 

public ObservableCollection<BackupEntry> BackupItems 
{ 
    get { return (ObservableCollection<BackupEntry>)GetValue(BackupItemsProperty); } 
    set { SetValue(BackupItemsProperty, value); } 
} 

public ExplorerWindow() 
{ 
    DefaultStyleKeyProperty.OverrideMetadata(typeof(ExplorerWindow), new FrameworkPropertyMetadata(typeof(ExplorerWindow))); 
    SetValue(BackupItemsProperty, _BackupItems); 
    _BackupItems.CollectionChanged += new NotifyCollectionChangedEventHandler(BackupItems_CollectionChanged); 
} 

void BackupItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 

और परीक्षण अनुप्रयोग में:: यहाँ कोड है कि मैं का उपयोग कर रहा है

<my:ExplorerWindow Name="ew" HorizontalAlignment="Left" VerticalAlignment="Top" Width="503" Height="223" BackupItems="{Binding BackupListItems}" /> 

मैं अपने परीक्षण अनुप्रयोग में स्क्रीन पर एक बटन बनाया। जब इसे क्लिक किया जाता है, तो बैकअप लिस्ट इटम्स में एक आइटम जोड़ा जाता है। बैकअप Items_CollectionChanged कभी नहीं कहा जाता है और मेरे संग्रह में मेरे संग्रह में नया आइटम नहीं दिखाया जाता है। क्या मैं यहां पूरी तरह से ट्रैक कर रहा हूँ? यह काम करने के लिए मुझे क्या करने की ज़रूरत है?

+0

क्या उपरोक्त कोड आपका व्यूमोडेल है? यदि हां, तो आप गुण –

+0

संख्या के बजाय निर्भरता ऑब्जेक्ट्स का उपयोग क्यों कर रहे हैं, उपर्युक्त कोड मेरे नियंत्रण के लिए कोडबेंड है। सूची में दर्ज किए जा रहे डेटा और इसे प्रदर्शित करने के लिए उपयोग किए जा रहे नियंत्रणों के बीच कोई प्रत्यक्ष सहसंबंध नहीं है। निर्भरता ऑब्जेक्ट सूची का पर्दाफाश करने के लिए है ताकि इसे बाध्य किया जा सके और डेटा को नियंत्रण से और पास किया जा सके। –

उत्तर

9

आपको this question में दिए गए पैटर्न का पालन करना चाहिए। आपको उपरोक्त लिंक में दिखाए गए PropertyChanged हैंडलर के भीतर CollectionChanged ईवेंट की सदस्यता लेने की आवश्यकता है।

+0

यह पूरी तरह से काम किया। जल्दी जवाब देने का शुक्रिया। –

-1

संग्रह परिवर्तित ईवेंट केवल बैकअपअप के डिफ़ॉल्ट मान के लिए सदस्यता लिया गया है जिसे आपने एक्सप्लोररविंडो कन्स्ट्रक्टर में सेट किया है। फिर आप अपने व्यूमोडेल में संग्रह के साथ डिफ़ॉल्ट मान को प्रतिस्थापित करते हैं - जिसकी आपने सदस्यता नहीं ली है। संपत्ति सेट होने पर आपको संग्रहित करने की सदस्यता लेनी होगी। आप DependencyProperty.Register के ओवरलोड का उपयोग कर सकते हैं जो प्रॉपर्टीमैटाडाटा स्वीकार करता है और जब संपत्ति बदलती है तो कॉलबैक की आपूर्ति करता है। यहां एक मोटा स्केच है - इसे संकलित नहीं किया है, लेकिन आपको सही दिशा में इंगित करना चाहिए।

public static readonly DependencyProperty BackupItemsProperty = DependencyProperty.Register(
    "BackupItems", 
    typeof(ObservableCollection<BackupEntry>), 
    typeof(ExplorerWindow), 
    OnBackupItemsChanged); 

private void OnBackupItemsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var old = (ObservableCollection<BackupEntry>)e.OldValue; 
    if (old != null) 
    { 
     old.CollectionChanged -= BackupItems_CollectionChanged; 
    } 
    ((ObservableCollection<BackupEntry>)e.NewValue).CollectionChanged += BackupItems_CollectionChanged; 
} 

void BackupItems_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 
+0

यह काम नहीं करता है। 'निर्भरता प्रॉपर्टी' एक स्थिर है, लेकिन 'ऑनबैकअप इटम्स चेंज' नहीं है। –

संबंधित मुद्दे