2010-12-27 13 views
9

मुझे आइटम्ससोर्स संपत्ति के साथ UserControl मिला है।कस्टम आइटम्ससोर्स निर्भरता संपत्ति के साथ उपयोगकर्ता नियंत्रण

:

#region ItemsSource Dependency Property 
    public static readonly DependencyProperty ItemsSourceProperty = 
     DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(MonthViewControl), 
     new PropertyMetadata(OnItemsSourceChanged)); 

    static void OnItemsSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     (obj as MonthViewControl).OnItemsSourceChanged(e); 
    } 

    private void OnItemsSourceChanged(DependencyPropertyChangedEventArgs e) 
    { 
     RefreshLayout(); 
    } 

    public IEnumerable ItemsSource 
    { 
     get 
     { 
      return (base.GetValue(ItemsSourceProperty) as IEnumerable); 
     } 
     set 
     { 
      base.SetValue(ItemsSourceProperty, value); 
     } 
    } 

    #endregion 

अब मेरी ViewModel में मैं एक घटनाक्रम संपत्ति जो इतनी तरह EventItem मदों की एक ICollectionView है: जैसा कि आधार UserControl वर्ग ItemsSource को लागू नहीं करता है, मैं इस तरह अपने ही निर्भरता संपत्ति बनाने के लिए किया था

private ObservableCollection<Controls.EventCalendar.EventItem> eventItems; 
    private CollectionViewSource events; 
    public System.ComponentModel.ICollectionView Events 
    { 
     get 
     { 
      if (events == null) 
      { 
       events = new CollectionViewSource(); 
       events.Source = eventItems; 
      } 

      return events.View; 
     } 
    } 

मुद्दा मैं का सामना करना पड़ रहा है कि मेरे विचार में, जब मैं घटनाक्रम संपत्ति के लिए बाध्य है, और मैं eventItems में कोई आइटम जोड़ने, UserControl ItemsSourceChanged घटना सक्रिय नहीं होगा और इसलिए यूआई अद्यतन नहीं है। परीक्षण के लिए मैंने दृश्य में एक साधारण सूची बॉक्स जोड़ा जो घटनाओं की संपत्ति से भी जुड़ा हुआ है। यह एक आकर्षण की तरह काम करता है। घटनाओं के लिए अद्यतन इटम्स देखने योग्य चयन सूची बॉक्स में दिखाई देता है।

मुझे लगता है कि यह मेरे आइटमसोर्स निर्भरता संपत्ति के साथ कुछ करने के लिए है। हो सकता है कि मुझे कस्टम कंट्रोल का उपयोग करने की आवश्यकता होगी जो UserControl के बजाय आइटम्स कंट्रोल बनाता है?

मेरी समस्या को समझने में आपकी सहायता के लिए: मैं कैलेंडर जैसे नियंत्रण बनाने की कोशिश कर रहा हूं जो ईवेंट/एजेंडा प्रविष्टियां दिखाता है (Google कैलेंडर के समान)। यह एक सम्मोहन की तरह काम करता है। जब नियंत्रण का आकार बदलता है तो यूआई अपडेट किया जाता है। आइटम्ससोर्स में बदलाव होने के बाद ही एकमात्र चीज ऑटोमैजिकल अपडेट है।

आशा किसी की मदद कर सकते हैं।

संपादित करें: जिस पल मैंने पोस्ट किया था, मुझे एहसास हुआ कि ईवेंट को निकाला नहीं जा सकता क्योंकि आइटमसोर्स प्रॉपर्टी नहीं बदली है। यह अंतर्निहित संग्रह है जो बदलता है। हालांकि, मैं इसे संभालने का तरीका नहीं हूं। इस काम को करने के लिए मुझे क्या करने की आवश्यकता है। बस एक संकेत पर्याप्त होगा। मुझे हर कार्यान्वयन के विवरण की आवश्यकता नहीं है।

उत्तर

6

परावर्तक भीतर PresentationFramework.dll खुलने और System.Windows.Controls.ItemsControl को देखकर निम्नलिखित पता चला:

public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), 
    typeof(ItemsControl), new FrameworkPropertyMetadata(null, 
    new PropertyChangedCallback(ItemsControl.OnItemsSourceChanged))); 

private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    ItemsControl control = (ItemsControl) d; 
    IEnumerable oldValue = (IEnumerable) e.OldValue; 
    IEnumerable newValue = (IEnumerable) e.NewValue; 
    ItemValueStorageField.ClearValue(d); 
    if ((e.NewValue == null) && !BindingOperations.IsDataBound(d, ItemsSourceProperty)) 
    { 
     control.Items.ClearItemsSource(); 
    } 
    else 
    { 
     control.Items.SetItemsSource(newValue); 
    } 
    control.OnItemsSourceChanged(oldValue, newValue); 
} 

नहीं जानते हुए भी क्या RefreshLayout करता है मेरी कूबड़ यह रास्ता के साथ क्या करना है कि कुछ है ObservableCollection<T> को लपेटा जा रहा है क्योंकि उपरोक्त कोड कंक्रीट संग्रह प्रकार के लिए अनजान है और इसलिए इसे लिपटे प्रकार से संभाला जाएगा; इस मामले में ObservableCollection<T> डिफ़ॉल्ट दृश्य को वापस करने के लिए नीचे दी गई अपनी संपत्ति को संशोधित करने का प्रयास करें और अपनी ItemsSource संपत्ति को ढांचे से उपरोक्त कोड के समान और समायोजित करने के लिए समायोजित करें।

private ObservableCollection<Controls.EventCalendar.EventItem> eventItems; 
private ICollectionview eventsView; 
public System.ComponentModel.ICollectionView Events 
{ 
    get 
    { 
     if (eventsView == null) 
      eventsView = CollectionViewSource.GetDefaultView(eventItems); 
     return eventsView; 
    } 
} 
+0

देर से उत्तर के लिए खेद है। मैं आपके उत्तर को 'उत्तर' के रूप में चिह्नित करने जा रहा हूं क्योंकि यह जाने का तरीका दिखता है। हालांकि, मैं निश्चित रूप से यह नहीं बता सकता क्योंकि मैंने इसे आजमाया नहीं है। दरअसल, मैंने UserControl से नियंत्रण को एक कस्टम कंट्रोल पर रीडिज़ाइन करने का निर्णय लिया जो आइटम नियंत्रण से विरासत में आता है और यह समस्या को हल करने के लिए (अभी के लिए) लगता है। –

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