我已经在名为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));
当此值更改时(如果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
中却说
无法设置处理程序,因为该事件是静态事件。
当我尝试编译时说
XML命名空间“ clr-namespace:...”中不存在属性“ ValueChanged”。
如果我尝试将事件设置为非静态,则无法在静态OnValuePropertyChanged
方法中使用该事件。
答案 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;