Как определить и вызвать событие внутри статического метода (PropertyChangedCallback) - PullRequest
0 голосов
/ 20 февраля 2019

Я определил событие в пользовательском элементе управления (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));

Iнужно запустить мое событие при изменении этого значения (если FireValueChanged равно true).

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 он говорит, что

не может установить обработчик, потому что событие является статическим событием.

И когда я пытаюсь скомпилировать, он говорит, что

, свойство 'ValueChanged' не существует в пространстве имен XML 'clr-namespace: ...'.

Если я попытаюсь установить событие как нестатическое, я не смогу использовать его внутри статического OnValuePropertyChanged метода.

1 Ответ

0 голосов
/ 20 февраля 2019

Вы можете получить доступ к элементу управления, для которого было изменено значение, в вашем методе 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;
...