自定义控件开发:不继承ItemsControl的实践

在进行UI开发时,经常需要根据特定的需求来创建自定义控件。本文将介绍一种不继承自ItemsControl的自定义控件开发方法,以及如何实现数据绑定和UI元素的动态更新。

在开发自定义控件时,可能会遇到一些需求,这些需求无法通过现有的ItemsControl控件来满足。例如,可能需要一个控件来显示项目的数量,而不是由数据源中的项目数量来决定。在这种情况下,可能需要创建一个不继承自ItemsControl的自定义控件。

使用自定义控件

自定义控件的使用与Silverlight中的其他ItemsControl控件类似。它具有ItemsSource和DisplayMemberPath属性,用于将数据绑定到控件。如果ItemSource实现了INotifyPropertyChanged接口,当值发生变化时,控件将闪烁字符。此外,控件还提供了一个UpdateRow方法,用于在控件未绑定时使用。

创建自定义ItemsControl

创建一个不继承自ItemsControl的自定义ItemsControl并不像想象的那么困难。需要实现的两个依赖属性是:

public static DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(FlickerBoard), new PropertyMetadata(new PropertyChangedCallback(OnItemsSourceChanged))); public IEnumerable ItemsSource { get { return (IEnumerable)base.GetValue(ItemsSourceProperty); } set { if (value != ItemsSource) base.SetValue(ItemsSourceProperty, value); } } private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { FlickerBoard table = d as FlickerBoard; table.Bind(); }

DisplayMemberPath依赖属性:

public static DependencyProperty DisplayMemberPathProperty = DependencyProperty.Register("DisplayMemberPath", typeof(string), typeof(FlickerBoard), null); public string DisplayMemberPath { get { return (string)base.GetValue(DisplayMemberPathProperty); } set { if (value != DisplayMemberPath) base.SetValue(DisplayMemberPathProperty, value); } }

要成功绑定到一个可枚举的数据源,只需要ItemsSource和DisplayMemberPath属性。但是,仅仅创建绑定是不够的,还需要将UI元素绑定到显示的各个项目。

绑定UI元素

为了将UI元素绑定到显示的各个项目,需要一个DisplayMemberPath属性,以及一个Item属性来维护正在表示的项目。如以下代码片段所示,还需要确定项目是否实现了INotifyPropertyChanged接口。

public object Item { get { return base.GetValue(ItemProperty); } set { if (value != Item) { var newValue = value as INotifyPropertyChanged; var oldValue = Item as INotifyPropertyChanged; if (oldValue != null) oldValue.PropertyChanged -= new PropertyChangedEventHandler(Item_PropertyChanged); base.SetValue(ItemProperty, value); if (newValue != null) newValue.PropertyChanged += new PropertyChangedEventHandler(Item_PropertyChanged); else DisplayText(this.Text); } } } void Item_PropertyChanged(object sender, PropertyChangedEventArgs e) { DisplayText(this.Text); }

添加一些反射来获取DisplayMemberPath值:

System.Reflection.PropertyInfo pi = Item.GetType().GetProperty(DisplayMemberPath);

以上就是创建自定义ItemsControl控件的基本步骤。在大多数情况下,不需要这么费力地实现一个ItemsControl。这种方法只有在控件中的项目需要“填充”控件内的显示时才需要。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485