在我的示例中,我使用了属性更改事件。在此处理程序中,我有一个声明方法。每次更改属性时该方法触发, 在该方法中,我已将值设置为属性。当我设置该值时,它是对事件处理程序的调用。因此它正在执行通函。如何使方法仅调用一次?
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;
}
在此代码中,每次更改的属性调用。
答案 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事件(正如名称本身所暗示的那样。)