我遵循MVVM模式。我创建了自定义列表框控件,将其命名为ExtendedListbox。
在xmal中,我已经定义了listbox并定义了ItemSource属性。 <ExtendedListBox ItemsSource="{Binding Students}">
在我的viewmodel中,我将学生定义为ObservableCollection。
public ObservableCollection <Student>
学生;
运行时,我在学生集合中添加/删除学生对象。
在我的ExtendedListBox控件类中,我想知道从列表框的数据源添加/删除哪个对象。
是否有任何事件在列表框的数据源中添加或删除任何项目时被触发?
答案 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
。