WPF自定义控件:集合类型的DependencyProperty [英] WPF Custom Control: DependencyProperty of Collection type

查看:285
本文介绍了WPF自定义控件:集合类型的DependencyProperty的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 CustomControl ,其中包含一个 ListBox

I have a CustomControl which 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>

我将 ItemsSource 绑定到后面的代码:

I bind the ItemsSource with a property in the 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 ) );
            }
        }
    }

现在在我的 MainWindow 我尝试将 ObservableCollection 与我的 CustomControl 绑定及其ListSource DependencyProperty:

Now in my MainWindow I try to bind an ObservableCollection of "Articles" 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>

我得到的错误是:

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> 起作用。
那么,有没有一种方法可以将我的自定义控件的DependencyProperty与对象的ObservableCollection绑定而不必指定对象的类型?

If in the Custom Control I have ObservableCollection<Article> instead of ObservableCollection<object> it works. So is there a way I can bind my Custom Control's DependencyProperty with an ObservableCollection of objects without having to specify the object's type?

推荐答案

将ListSource的类型更改为IEnumerable,然后可以绑定到任何集合。

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

这篇关于WPF自定义控件:集合类型的DependencyProperty的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆