переопределить свойство itemsource в списке c # .net - PullRequest
2 голосов
/ 04 августа 2011

Я наследую ListBox своему классу и хочу переопределить свойство itemsource.

Я на самом деле хочу сделать некоторую операцию, когда назначен источник предметов.

как это возможно?

я хочу в коде c # только не в xaml

Ответы [ 3 ]

4 голосов
/ 04 августа 2011

Так вы переопределяете свойство зависимостей в 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 голос
/ 04 августа 2011

Здесь я создал ящик Custom List, который простирается от Listbox, и он получил свойство itemssource для источника зависимостей ...

Когда источник элемента обновляется, вы можете выполнять свои операции, и после этого вы можете вызывать метод updatesource для customlistbox, который назначит свойство itemsSource BaseClass.

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;
        }
    }
1 голос
/ 04 августа 2011

Почему бы просто не установить 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...