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