.NET用户设置事件处理程序

时间:2010-10-27 14:27:57

标签: c# .net

我正在尝试使用内置的.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来比较字符串以查看哪个属性已更改。有一个更好的方法吗?如果我稍后更改属性名称,可能会被遗忘。

5 个答案:

答案 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)

您可以创建一个变量并在运行时为其分配当前设置,然后在将变量与之前的变量进行比较后,只需更新一个变量。