我將ListBox繼承到我的類,我想重寫itemsource屬性。覆蓋列表框中的itemsource屬性c#.net
我實際上想在itemource被分配時做一些操作。
怎麼可能?
我想在C#代碼不僅沒有在XAML
我將ListBox繼承到我的類,我想重寫itemsource屬性。覆蓋列表框中的itemsource屬性c#.net
我實際上想在itemource被分配時做一些操作。
怎麼可能?
我想在C#代碼不僅沒有在XAML
你重寫在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.
}
}
這是你在找什麼?
爲什麼不直接設置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事件。
這裏我裝箱從列表框延伸的自定義列表框,它有一個依賴屬性的ItemsSource ...
當過項目源得到了更新,你可以做你的操作之後,你可以調用的updatesourcemethod customlistbox將分配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;
}
}
我想這個解決方案,我們不能做一些操作之前,分配itemssource權利..? MyListBoxItemsSourceChanged事件將在分配itemssource後被觸發... – Bathineni
@AngelWPF:當問題被標記爲WPF和Silverlight時,您是否可以在答案中包含與答案相關的平臺。在這種情況下,這個答案只適用於WPF,Silverlight沒有'OverrideMetadata'方法。 – AnthonyWJones
當然!我已編輯。 –