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

4

我正在尝试使用内置的.NET应用程序设置。例如,我有一个名为year的用户设置。

如果最终用户在程序中更改设置,则需要通过刷新显示的数据来响应。

我目前拥有以下代码来完成此操作:

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个回答

1
我相信没有更好的方法(使用生成的Settings类),因为Settings类的实现方式如下。请考虑一个简单字符串设置的生成类代码:
public string Test {
    get {
        return ((string)(this["Test"]));
    }
    set {
        this["Test"] = value;
    }
}

正如您所看到的,它使用带有字符串值的索引器 - 您没有任何专门的TestChanged事件或类似的内容。对OnPropertyChanged的调用在索引器setter中:

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

你可以选择像这样实现设置:

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事件上进行注册。


1
不,这不是一个好主意。代码太脆弱了。要早点捕捉到这个问题。例如,在用户界面层面上,无论您设置设置值的任何代码都可以触发事件,您将确切地知道正在修改什么。或者创建一个中间帮助类。

1
在早期的 .net framework 版本(我想是3.5)中,我们可以使用 nameof 关键字来避免使用神秘字符串,所以 e.PropertyChange == nameof(Year) 。这样,当属性标识符发生更改时,编译器会提醒你。

0
你可以在运行时创建一个变量,并将当前设置分配给它,然后只需在每次更改后将一个变量更新到先前进行比较的值即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接