如何找到当前称为的方法?

时间:2018-09-21 09:09:59

标签: c# wpf

在我的示例中,我使用了属性更改事件。在此处理程序中,我有一个声明方法。每次更改属性时该方法触发, 在该方法中,我已将值设置为属性。当我设置该值时,它是对事件处理程序的调用。因此它正在执行通函。如何使方法仅调用一次?

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;
}

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

2 个答案:

答案 0 :(得分:1)

基本是 nameof 关键字:

changed(nameof(Name));

您还可以通过在方法的参数中添加以下CallerMemberName attribute来完全省去指定名称的需要:

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));
   }
}

MVVM的实现

class Class1:Observable
{
    public Class1()
    {            
    }    

    string propertyValue;
    public string Property
    {
        get => propertyValue;
        set => SetPropertyAndNotifyIfNeeded(ref propertyValue, value);
    }
}

根据您的代码,从您的媒体资源中删除订阅,以避免递归循环:

Name.PropertyChanged+=(s,e)=>

在您的财产咨询电话changed(nameof(Name));

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));      
}
...
}

答案 1 :(得分:0)

正如我从您的问题中看到的那样,我想,您想对此提出一个Property Changed并设置一个值。基本上实现MVVM。 一个真正简单快捷的方法是使用已经存在的Nuget软件包,这将简化您的工作。 您可以使用的一种是GalaSoft.MvvmLight

添加Nuget程序包后,可以通过以下方式使用它:

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

RaisePropertyChanged,将为您引发PropertyChanged事件(正如名称本身所暗示的那样。)