自定义列表框控件事件处理

时间:2014-04-08 13:04:12

标签: wpf event-handling listbox

我遵循MVVM模式。我创建了自定义列表框控件,将其命名为ExtendedListbox。

在xmal中,我已经定义了listbox并定义了ItemSource属性。

<ExtendedListBox ItemsSource="{Binding Students}">

在我的viewmodel中,我将学生定义为ObservableCollection。

public ObservableCollection <Student>学生;

运行时,我在学生集合中添加/删除学生对象。

在我的ExtendedListBox控件类中,我想知道从列表框的数据源添加/删除哪个对象。

是否有任何事件在列表框的数据源中添加或删除任何项目时被触发?

1 个答案:

答案 0 :(得分:0)

如果您想要MVVM样式,那么我建议使用System.Windows.Interactivity并使用“行为”。

样本用法。

行为类

public class ListBoxBehavior : Behavior<ListBox>
{
    public static readonly DependencyProperty AddedItemsProperty =
        DependencyProperty.Register("AddedItems", typeof (List<object>), typeof (ListBoxBehavior), new PropertyMetadata(new List<object>()));

    public List<object> AddedItems
    {
        get { return (List<object>) GetValue(AddedItemsProperty); }
        set { SetValue(AddedItemsProperty, value); }
    }

    public static readonly DependencyProperty RemovedItemsProperty =
        DependencyProperty.Register("RemovedItems", typeof(List<object>), typeof(ListBoxBehavior), new PropertyMetadata(new List<object>));

    public List<object> RemovedItems
    {
        get { return (List<object>) GetValue(RemovedItemsProperty); }
        set { SetValue(RemovedItemsProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        var observableCollection = AssociatedObject.ItemsSource as ObservableCollection<object>;
        if (observableCollection != null)
        {
            observableCollection.CollectionChanged += ItemsSourceOnCollectionChanged;
        }
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        var observableCollection = AssociatedObject.ItemsSource as ObservableCollection<object>;
        if (observableCollection != null)
        {
            observableCollection.CollectionChanged -= ItemsSourceOnCollectionChanged;
        }
    }

    private void ItemsSourceOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs notifyCollectionChangedEventArgs)
    {
        AddedItems.Clear();
        RemovedItems.Clear();
        switch (notifyCollectionChangedEventArgs.Action)
        {
            case NotifyCollectionChangedAction.Add:
                foreach (var newItem in notifyCollectionChangedEventArgs.NewItems)
                {
                    AddedItems.Add(newItem);
                }
                break;
            case NotifyCollectionChangedAction.Remove:
                foreach (var newItem in notifyCollectionChangedEventArgs.NewItems)
                {
                    RemovedItems.Add(newItem);
                }
                break;
        }
    }
}

<强> XAML

    <ListBox>
        <i:Interaction.Behaviors>
            <ListBoxBehavior AddedItems="{Binding AddedItems}"/>
            <ListBoxBehavior AddedItems="{Binding RemovedItems}"/>
        </i:Interaction.Behaviors>
    </ListBox>

所发生的事情是订阅的事件封装在行为类中,您现在可以创建与该类关联的依赖项属性的绑定,该类是ListBox