OnDataContextChanged方法在WPF ListBox控件上不可用

时间:2011-04-20 13:07:41

标签: wpf

每当ListBox的datacontext发生更改时,我想执行一些自定义代码。我在多个表单上使用ListBox控件,并希望为所有表单实现(执行相同的自定义代码)相同的东西。

我想到的另一种选择是从ListBox派生并覆盖DataContext属性。但是,我发现DataContext属性不是虚拟的,因此无法在派生类中重写。此外,没有像'OnDataContextChanged'这样的方法可以在派生类中重写。

ListBox控件上存在DataContextChanged事件。现在唯一的选择是订阅基类事件的派生类,我觉得这可能不好,因为我之前没有这样做过。这是它的样子:

public class PanningListBox : ListBox 
{
    public PanningListBox()
    {
        base.DataContextChanged += new DependencyPropertyChangedEventHandler(PanningListBox_DataContextChanged);
    }

    void PanningListBox_DataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
    {
        //Custom logic goes here
    }
}

上述机制是否可行?还有更好的选择吗?对于其他事件(事件),ListBox控件具有可在派生类中重写的等效虚拟保护方法(OnEvent)。我想知道为什么DataContextChanged事件没有遵循事件设计指南?为什么'OnDataContextChanged'方法在ListBox类中不可用?

2 个答案:

答案 0 :(得分:1)

你可以覆盖OnPropertychanged:

protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
{
    if(e.Property == FrameworkElement.DataContextProperty)
    {
        //logic goes here
    }
}

答案 1 :(得分:1)

订阅基类事件是好的,即使我通常发现覆盖OnSomeEvent方法更优雅。这真的只是一种风格问题。无论如何,在这种情况下,你没有覆盖方法的选项......你可以按照MarkusHütter的建议覆盖OnPropertyChanged,但该选项并不总是可用(并非所有事件都与财产变化)。