如何为依赖属性创建公共事件?

3
在下面的代码中,您可以看到我正在尝试做什么,但它不起作用。我想要一个事件,可以在我的用户控件之外附加并在依赖属性更改时触发。
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value"
        , typeof(Double)
        , typeof(ucSlider)
        , new PropertyMetadata(50d, new PropertyChangedCallback(OnValueChanged)));

    public Double Value
    {
        get { return (Double)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    public event PropertyChangedCallback OnValueChanged;
1个回答

7

依赖属性是静态的,但您的事件与类的实例相关联。因此,您需要在静态属性和实例事件之间添加一个中间方法。

在此示例中,我将静态方法OnValuePropertyChanged作为回调参数传递,并在其中引发事件:

public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register("Value"
    , typeof(Double)
    , typeof(ucSlider)
    , new PropertyMetadata(50d, new PropertyChangedCallback(OnValuePropertyChanged)));

public Double Value
{
    get { return (Double)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

public static void OnValuePropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
    var sl = sender as ucSlider;
    if (sl != null)
        sl.RaiseValueChangedEvent(e);
}

private void RaiseValueChangedEvent(DependencyPropertyChangedEventArgs e)
{
    if(this.OnValueChanged != null)
        this.OnValueChanged(this, e);
}

public event PropertyChangedCallback OnValueChanged;

事件声明导致错误:类型“System.Windows.DependencyPropertyChangedEventArgs”无法用作泛型类型或方法“System.EventHandler<TEventArgs>”中的类型参数“TEventArgs”。从“System.Windows.DependencyPropertyChangedEventArgs”到“System.EventArgs”的装箱转换不存在。 - descf
@descf 我已经修复了错误并测试了新的代码,现在它可以正常工作。 - vortexwolf
感谢分享这个高尚的解决方案。 - Youngjae

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接