覆盖列表框c#.net中的itemsource属性

时间:2011-08-04 04:26:10

标签: c# wpf silverlight

我将ListBox继承到我的类,我想覆盖itemsource属性。

我实际上想在分配itemsource时进行一些操作。

怎么可能?

我希望c#代码不在xaml

3 个答案:

答案 0 :(得分:4)

在WPF中覆盖依赖项属性的方式是这样....

    public class MyListBox : ListBox
    {
        //// Static constructor to override.
        static MyListBox()
        {
              ListBox.ItemsSourceProperty.OverrideMetadata(typeof(MyListBox), new FrameworkPropertyMetadata(null, MyListBoxItemsSourceChanged));
        }

        private static void MyListBoxItemsSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
             var myListBox = sender as MyListBox;
             //// You custom code.
        }
    } 

这是你在找什么?

答案 1 :(得分:1)

为什么不在设置项目源属性之前设置 SourceUpdated 事件处理程序?

例如, MyListBox 是您的列表框& MyItemSource 是源代码,您可以设置事件处理程序n,如下所示调用它:

void MyFunction()
        {
           MyListBox.SourceUpdated += new EventHandler<DataTransferEventArgs>(MyListBox_SourceUpdated);    
           MyListBox.ItemsSource    = MyItemSource;
        }

void MyListBox_SourceUpdated(object sender, DataTransferEventArgs e)
        {
            // Do your work here
        }

此外,请确保您的数据源实现INotifyPropertyChanged或INotifyCollectionChanged事件。

答案 2 :(得分:1)

这里我创建了一个自定义列表框,它从Listbox扩展而来,它有一个依赖属性itemssource ...

当项目源更新时,你可以进行操作,之后你可以调用customlistbox的updatesource方法,它将分配BaseClass的itemsSource属性。

public class CustomListBox : ListBox
    {

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

        // Using a DependencyProperty as the backing store for ItemsSource.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ItemsSourceProperty =
            DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(CustomListBox), new UIPropertyMetadata(0, ItemsSourceUpdated));

        private static void ItemsSourceUpdated(object sender, DependencyPropertyChangedEventArgs e)
        {
            var customListbox = (sender as CustomListBox);
            // Your Code
            customListbox.UpdateItemssSource(e.NewValue as IEnumerable);
        }

        protected void UpdateItemssSource(IEnumerable source)
        {
            base.ItemsSource = source;
        }
    }