我将ListBox继承到我的类,我想覆盖itemsource属性。
我实际上想在分配itemsource时进行一些操作。
怎么可能?
我希望c#代码不在xaml
中答案 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;
}
}