WPF user control: DependencyProperty of type Collection

I have a CustomControl that contains a ListBox :

 <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> 

I bind the ItemsSource with a property in Code Behind:

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

Now in my MainWindow I'm trying to link the ObservableCollection from the "Article" with my CustomControl and its ListSource DependencyProperty:

 <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> 

And the error I get:

 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]' 

If the user control has an ObservableCollection<Article> instead of an ObservableCollection<object> , it works. So, is it possible to associate your DependencyProperty user control with an ObservableCollection of objects without specifying an object type?

+6
source share
1 answer

Change the ListSource type to IEnumerable, then you can bind to any collection.

+5
source

Source: https://habr.com/ru/post/885908/


All Articles