Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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

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# 如何找到当前调用的方法?_C#_Wpf - Fatal编程技术网

C# 如何找到当前调用的方法?

C# 如何找到当前调用的方法?,c#,wpf,C#,Wpf,在我的示例中,我使用了属性更改事件。在这个处理程序中,我有一个declare a方法。每次该方法在更改属性时触发, 在该方法中,我已将值设置为属性。当我设置该值时,它是对事件处理程序的调用。所以它在执行通告。如何使方法只调用一次 private string name; public string Name { get { return name; } set { name= value; N

在我的示例中,我使用了属性更改事件。在这个处理程序中,我有一个declare a方法。每次该方法在更改属性时触发, 在该方法中,我已将值设置为属性。当我设置该值时,它是对事件处理程序的调用。所以它在执行通告。如何使方法只调用一次

private string name;
public string Name
    {
        get { return name; }
        set
        {
            name= value;
            Name.PropertyChanged+=(s,e)=>
              {
                   Changed(s as string);
              };
         }
     }
private void changed(string name)
{
   Name = name;
}

在此代码中,每次都会调用更改的属性。

基本内容是关键字:

changed(nameof(Name));
通过向方法的参数中添加以下内容,您可以更进一步,完全不需要指定名称:

private void changed([CallerMemberName]string name=null){}
在这种情况下,您可以在不使用属性名的情况下调用此方法:
changed()

我猜您想要实现MVVM。到目前为止,实现它最优雅的方法是使用以下基类:

public abstract class Observable : INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;

   protected bool SetPropertyAndNotifyIfNeeded<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
   {
      if (EqualityComparer<T>.Default.Equals(field, value))
         return false;
      field = value;
      NotifyPropertyChanged(propertyName);
      return true;
   }    
   protected void NotifyPropertyChanged([CallerMemberName]string name=null)
   {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
   }
}
根据您的代码,从属性中删除订阅以避免递归循环:

Name.PropertyChanged+=(s,e)=>
在您的属性调用中
已更改(nameof(Name))


正如我从你的问题中所看到的,我猜,你想提出一个改变了的属性并设置一个值。基本上实现MVVM。 一个非常简单快捷的方法是使用一个已经存在的Nuget包,这将简化您的工作。 一个你可以使用的是

添加Nuget包后,您可以按以下方式使用它:

 public string name;
    public string Name
    {
        get { return name; }
        set
        {
            name= value;
            RaisePropertyChanged(nameof(Name));
        }
    }

RaisePropertyChanged将为您引发PropertyChanged事件(顾名思义)。

您发布的代码不会编译,因为
System.String
类型没有
PropertyChanged
事件。不要在事件处理程序中调用Changed?很难知道您试图在这里实现什么我想它与wpf绑定。。如果我理解你的问题,如果你只需要一个绑定,你可以在wpf中精确模式=一次。。但你的问题很难理解……事实上,mvvm light有一个set函数,它可以根据名称引发propertychanged;您可以调用Set(ref name,value);在setter中,代码略短。感谢您提供的信息,我将对此进行研究。它肯定更短。
class a:INotifyPropertyChanged
{
   public event PropertyChangedEventHandler PropertyChanged;       

....
private string name;
public string Name
    {
        get { return name; }
        set
        {
            if (name!=value)
            {
                name= value;
                changed();
            }
         }
     }
private void changed([CallerMemberName]string name=null)
{
   PropertyChanged.?Invoke(this, new PropertyChangedEventArgs(name));      
}
...
}
 public string name;
    public string Name
    {
        get { return name; }
        set
        {
            name= value;
            RaisePropertyChanged(nameof(Name));
        }
    }