2011-04-14 14 views
6

मैं एक CustomControl है शामिल है जो एक ListBox:WPF कस्टम नियंत्रण: संग्रह प्रकार के DependencyProperty

public partial class CustomList : UserControl, INotifyPropertyChanged 
    { 
     public CustomList() 
     { 
      InitializeComponent(); 
     } 

     public ObservableCollection<object> ListSource 
     { 
      get 
      { 
       return (ObservableCollection<object>)GetValue(ListSourceProperty); 
      } 
      set 
      { 
       base.SetValue(CustomList.ListSourceProperty, value); 
       NotifyPropertyChanged("ListSource"); 
      } 
     } 

     public static DependencyProperty ListSourceProperty = DependencyProperty.Register(
      "ListSource", 
      typeof(ObservableCollection<object>), 
      typeof(CustomList), 
      new PropertyMetadata(OnValueChanged)); 

     private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      ((CustomList)d).ListSource = (ObservableCollection<object>)e.NewValue; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     public void NotifyPropertyChanged(string propertyName) 
     { 
      if(PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

अब मेरी MainWindow में:

<UserControl x:Class="WpfApplication1.CustomList" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <ListBox Name="listBox1" ItemsSource="{Binding ListSource}" /> 
    </Grid> 
</UserControl> 

मैं पीछे कोड में एक संपत्ति के साथ ItemsSource बाँध मैं अपने CustomControl के साथ "लेख" के ObservableCollection को बांधने की कोशिश करता हूं और इसकी सूची स्रोत निर्भरता प्रॉपर्टी:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:local="clr-namespace:WpfApplication1" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <local:CustomList ListSource="{Binding Articles}"/> 
    </Grid> 
</Window> 

और त्रुटि मैं:

Error: 1 : Cannot create default converter to perform 'one-way' conversions between types 'System.Collections.ObjectModel.ObservableCollection`1[WpfApplication1.Article]' and 'System.Collections.ObjectModel.ObservableCollection`1[System.Object]' 

तो कस्टम नियंत्रण में मैं ObservableCollection<Article>ObservableCollection<object> के बजाय यह काम करता है। तो क्या कोई तरीका है कि मैं ऑब्जेक्ट के प्रकार को निर्दिष्ट किए बिना ऑब्जेक्ट्स के ऑब्जेर्जेबल कोलेक्शन के साथ अपने कस्टम कंट्रोल की निर्भरता प्रॉपर्टी को बांध सकता हूं?

+1

आपको निर्भरता प्रॉपर्टी पर सेट किए गए INotifyProperty को लागू करने की आवश्यकता नहीं है (वास्तव में नहीं) ** ** ** निर्भरता प्रक्षेपण के सेटटर में कोई भी कोड न रखें। –

+0

@ एचबी। क्या आप कह रहे हैं कि निर्भरता संपत्ति स्वचालित रूप से उचित परिवर्तन अधिसूचनाओं को लागू करेगी? या, क्या आप सुझाव दे रहे हैं कि एक बेहतर विकल्प है? – Rachael

+0

@ यूबी 3571: हां वे परिवर्तन अधिसूचनाओं को लागू करते हैं लेकिन वे थ्रेड एफ़िनिटी पेश करते हैं। वैकल्पिक है, जैसा कि मैंने कहा था, 'INotifyPropertyChanged'। –

उत्तर

5

आईन्यूमेरेबल में ListSource का प्रकार बदलें, फिर आप किसी भी संग्रह से जुड़ सकते हैं।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद, आपने दिन को पूरी तरह से बचाया। – Aris

+0

इस ब्लॉग पोस्ट के मुताबिक, आपको IList का उपयोग करना चाहिए ताकि आप एक्सएमएल को भी फेंक सकें। http://sshumakov.com/2012/11/13/how-to-create- निर्भरता-properties-for-collections/ –

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