c# - 触发 OnPropertyChanged 时更新其他属性

标签 c# .net model

我检查了这里的其他链接,但我无法真正得到正确的答案。我有 xaml,它由两个文本框组成。第一个是小时,而下一个是分钟。每当我更改文本框中的小时值时,分钟都应重置为 0。如何使用 OnPropertyChange 来实现?

public class Variable : INotifyPropertyChanged
{
    public Variable()
    {
        this.hours = "1";
        this.minutes = "2";
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private string hours;
    private string minutes;

    public string Hours
    {
        get { return this.hours.ToString(); }
        set
        {
            if (this.hours != value)
            { 
                this.hours = value;
                this.minutes = "0";
                this.OnPropertyChanged("Hours");
            }
        }
    }

    public string Minutes { get { return this.minutes; } }

    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName ));
    }
}

最佳答案

除非 Minutes 文本框是只读的,否则您应该为该属性设置一个 setter :

public string Minutes
{
    get => this.minutes; 
    set
    {
        if (this.minutes != value)
        {
            this.minutes = value;
            OnPropertyChanged();
        }
    }
}

现在您可以在 Hours setter 中使用此 setter 来通知 UI 更改:

if (this.hours != value)
{ 
    this.hours = value;
    this.OnPropertyChanged();
    this.Minutes = "0";
}

相反,如果 Minutes 是正确的只读属性,那么您有两个选择:将其 setter 设为 private(并按上述方式使用)或手动调用 OnPropertyChanged() 将更改通知 UI:

if (this.hours != value)
{ 
    this.hours = value;
    this.OnPropertyChanged();

    this.minutes = "0";
    this.OnPropertyChanged(nameof(Minutes));
}

我强烈反对第二种选择,因为它增加了不必要的复杂性,除非绝对需要,否则我不想手动通知更改。


所有这些都表明您可以在代码中改进一些东西。

OnPropertyChanged() 有一个带有 [CallerMemberName] 属性的参数,那么您不需要指定属性名称(如果它是从该属性中调用的)。当您必须(参见第二个示例)时,请使用 nameof(PropertyName) 而不是 "PropertyName",因为它会在您重命名您的属性时自动更改。

我没有你的代码的大图,但如果HoursMinutes 是整数属性,那么你应该有 int 而不是 string。如果输入错误,您最好尽快通知用户。您还应该验证值:

if (value < 0 || value >= 60)
    throw new ArgumentOutOfRangeException(...);

不是在这种情况下,但通常当你有一个属性,其中支持字段只是因为你没有 setter 那么你可以使用:

public string Minutes { get; private set; }

关于c# - 触发 OnPropertyChanged 时更新其他属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46765074/

相关文章:

database - 谷歌应用引擎 : Model integrity constraints?

c# - 当集合计数小于参数时取(参数)

c# - 用于 Visual Studio 2010 的 Crystal 报表

c# - 如何使用 C# 确定日期是昨天、上个月还是去年?

.net - 如何从 PDB 文件中删除构建路径

mysql - NodeJS sequelize 自动生成模型并运行迁移 SQL 语法错误

c# - 如何测试使用 DbEntityValidationException 的异常扩展方法?

c# - 我如何才能等到表单句柄创建后再使用其组件?

.net - IronPython 中的深层复制

python - 将保存的 keras 模型从 gs 加载到 pydatalab