如何在静态方法(PropertyChangedCallback)中定义和引发事件

时间:2019-02-20 15:23:08

标签: c# wpf xaml events custom-controls

我已经在名为Field的自定义控件(ValueChanged)中定义了一个事件。

public static event EventHandler<ValueChangedEventArgs> ValueChanged;

还有一个依赖项属性Value

public string Value
{
    get => (string)GetValue(ValueProperty);
    set => SetValue(ValueProperty, value);
}

public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register(nameof(Value), typeof(string), typeof(Field),
        new PropertyMetadata(OnValuePropertyChanged));

当此值更改时(如果FireValueChangedtrue),我需要触发事件。

private static void OnValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    bool fire = (bool)d.GetValue(FireValueChangedProperty);
    if (fire) ValueChanged?.Invoke(d, new ValueChangedEventArgs($"{e.NewValue}", $"{e.OldValue}"));
}

这是ValueChangedEventArgs

public class ValueChangedEventArgs : EventArgs
{
    public string NewValue { get; }
    public string OldValue { get; }
    //Other calculated properties...

    public ValueChangedEventArgs(string newValue, string oldValue)
    {
        NewValue = newValue;
        OldValue = oldValue;
    }
}

但是在我的main window中却说

  

无法设置处理程序,因为该事件是静态事件。

当我尝试编译时说

  

XML命名空间“ clr-namespace:...”中不存在属性“ ValueChanged”。

如果我尝试将事件设置为非静态,则无法在静态OnValuePropertyChanged方法中使用该事件。

1 个答案:

答案 0 :(得分:3)

您可以像这样(在我将控件类命名为OnValuePropertyChanged的情况下)在MyControl方法中访问更改了值的控件:

private static void OnValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    bool fire = (bool)d.GetValue(FireValueChangedProperty);
    var ctrl = (MyControl)d;
    if (fire) 
      ctrl.ValueChanged?.Invoke(d, new ValueChangedEventArgs($"{e.NewValue}", $"{e.OldValue}"));
}

然后,您可以删除static并将事件更改为实例级别的事件:

public event EventHandler<ValueChangedEventArgs> ValueChanged;