Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在静态方法(PropertyChangedCallback)内定义和引发事件_C#_Wpf_Xaml_Events_Custom Controls - Fatal编程技术网

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

C# 如何在静态方法(PropertyChangedCallback)内定义和引发事件,c#,wpf,xaml,events,custom-controls,C#,Wpf,Xaml,Events,Custom Controls,我在名为ValueChanged的自定义控件(字段)中定义了一个事件 public static event EventHandler<ValueChangedEventArgs> ValueChanged; 当此值更改时,我需要触发事件(如果FireValueChanged为true) 这是valuechangedventargs类 public class ValueChangedEventArgs : EventArgs { public string NewValu

我在名为
ValueChanged
的自定义控件(
字段
)中定义了一个事件

public static event EventHandler<ValueChangedEventArgs> ValueChanged;
当此值更改时,我需要触发事件(如果
FireValueChanged
true

这是
valuechangedventargs

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;
    }
}
但是在我的
主窗口中它说

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

当我试图编译它时,它说

XML命名空间“clr命名空间:…”中不存在属性“ValueChanged”


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

您可以访问在
OnValuePropertyChanged
方法中更改值的控件,如下所示(我已将控件类命名为
MyControl
):

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

public event EventHandler<ValueChangedEventArgs> ValueChanged;
公共事件事件处理程序值已更改;

您可以访问在
OnValuePropertyChanged
方法中更改值的控件,如下所示(我将控件类命名为
MyControl
):

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

public event EventHandler<ValueChangedEventArgs> ValueChanged;
公共事件事件处理程序值已更改;

旁注:使用和订阅
静态事件时要非常小心。导致潜在内存泄漏的好方法。旁注:使用和订阅
静态
事件时要非常小心。导致潜在内存泄漏的好方法。
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}"));
}
public event EventHandler<ValueChangedEventArgs> ValueChanged;