我正在尝试使用内置的.NET应用程序设置。例如,我的用户设置为年份。
如果最终用户更改了程序中的设置,我需要通过刷新显示的数据进行响应。
我目前有以下代码来执行此操作:
Settings.Default.PropertyChanged += SettingsChanged;
//on year change clear out the grid and update the data
private void SettingsChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "year")
{
grdStudentCourseSearch.DataSource = null;
grdStudentCourseSearch.DataMember = null;
UpdateData();
}
}
正如您所看到的,它们似乎只是所有设置的事件处理程序,我必须使用e.PropertyName来比较字符串以查看哪个属性已更改。有一个更好的方法吗?如果我稍后更改属性名称,可能会被遗忘。
答案 0 :(得分:1)
由于设置类的实现,我认为没有更好的方法(使用生成的Settings类) 考虑为简单的字符串设置生成的类代码:
public string Test {
get {
return ((string)(this["Test"]));
}
set {
this["Test"] = value;
}
}
正如您所看到的,它使用带有字符串值的索引器 - 您没有任何专门的TestChanged
事件或其他类似事件。对OnPropertyChanged
的调用位于索引器设置器中:
set
{
SettingChangingEventArgs e = new SettingChangingEventArgs(propertyName, base.GetType().FullName, this.SettingsKey, value, false);
this.OnSettingChanging(this, e);
if (!e.Cancel)
{
base[propertyName] = value;
PropertyChangedEventArgs args2 = new PropertyChangedEventArgs(propertyName);
this.OnPropertyChanged(this, args2);
}
}
答案 1 :(得分:1)
您可以选择实施以下设置:
class Settings
{
public event EventHandler YearChanged;
private int _year;
public int Year
{
get { return _year; }
set
{
if (_year != value)
{
_year = value;
OnYearChanged(EventArgs.Empty);
}
}
}
protected virtual void OnYearChanged(EventArgs e)
{
if (YearChanged != null)
YearChanged(this, e);
}
}
然后您可以注册YearChanged
事件。
答案 2 :(得分:1)
不,这不是个好主意。代码太多太脆弱了。抓住这个。例如,在用户界面级别,您设置了设置值的任何代码。它可以触发事件,您将确切知道要修改的内容。或者做一个中间帮助班。
答案 3 :(得分:1)
在早期的.net框架(我认为3.5)中,我们可以使用nameof关键字来避免魔术字符串,因此e.PropertyChange == nameof(Year)。因此,当属性标识符发生更改时,编译器会向您发出警告。
答案 4 :(得分:0)
您可以创建一个变量并在运行时为其分配当前设置,然后在将变量与之前的变量进行比较后,只需更新一个变量。