【问题标题】:Refresh Property when property change within other object当其他对象中的属性更改时刷新属性
【发布时间】:2018-03-01 12:11:47
【问题描述】:

假设我有以下类(模型)

public class Employee : ObservableBase {
  private int _id;
  public int Id {
    get { return _id; }
    set { this.Update( x => x.Id, ( ) => _id = value, _id, value ); }
  }

  private string _name;
  public string Name {
    get { return _name; }
    set { this.Update( x => x.Name, ( ) => _name = value, _name, value ); }
  }

  private EmployeeStatus _level;
  public EmployeeStatus Level {
    get { return _level; }
    set { this.Update( x => x.Level, ( ) => _level = value, _level, value ); }
  }

  private RecordState _state;
  public RecordState State {
    get { return _state; }
    set { this.Update( x => x.State, ( ) => _state = value, _state, value ); }
  }

}

public class Enums {
  public enum EmployeeStatus {
    Junior = 1,
    Medior = 2,
    Senior = 3
  }

  public enum RecordState {
    Add = 1,
    Edit = 2,
    Delete = 3
  }
}

我编写了一个包装类,以便能够公开额外的属性(确定可见性并在某些控件的视图上禁用/启用):

public class EmployeeCustom : ObservableBase {

  private Employee _employee;
  public Employee Employee {
    get { return _employee; }
    set { this.Update( x => x.Employee, ( ) => _employee = value, _employee, value ); }
  }

  public Visibility SeniorTestVisible {
    get { return Employee.Level == EmployeeStatus.Senior && Employee.State == RecordState.Add ? Visibility.Visible : Visibility.Collapsed; }
  }


}

我的 EmployeeCustom 类在我的视图中用作 DataContext 如何确定我的 StateLevel 何时发生变化,以便在 Employee 对象中的任何这些属性发生变化时,我的 SeniorTestVisible 可以“刷新”。请注意,我不允许对 Employee Class 进行任何更改。仅在 EmployeeCustom 中。

【问题讨论】:

  • 这听起来像是你的作业?
  • 您的INotifyPropertyChanged 实施在哪里?
  • 与其重新发明轮子,不如考虑使用 mvvmlight,然后研究 RaisePropertyChanged 功能。这样,您可以更新一个属性并强制同时将另一个属性视为已更新。

标签: c# wpf properties observable


【解决方案1】:

我如何确定我的StateLevel 何时更改,以便我的SeniorTestVisibleEmployee 对象中的任何这些属性发生更改时“刷新”。

您为Employee 类(希望)在这些属性中的任何一个发生更改时引发的事件连接一个事件处理程序,并在任何时候为EmployeeCustom 类的SeniorTestVisible 属性引发PropertyChanged 事件。发生这种情况,例如:

public class EmployeeCustom : ObservableBase
{
    private Employee _employee;
    public Employee Employee
    {
        get { return _employee; }
        set
        {
            if (_employee != null)
                _employee.PropertyChanged -= OnEmployeePropertyChanged;
            if(value != null)
                value..PropertyChanged += OnEmployeePropertyChanged;

            this.Update(x => x.Employee, () => _employee = value, _employee, value);
        }
    }

    public Visibility SeniorTestVisible
    {
        get { return Employee.Level == EmployeeStatus.Senior && Employee.State == RecordState.Add ? Visibility.Visible : Visibility.Collapsed; }
    }

    public void OnEmployeePropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if(e.PropertyName == "Level" || e.PropertyName == "State")
        {
            this.NotifyPropertyChanged("SeniorTestVisible");
        }
    }
}

如果Employee 类没有引发任何事件,你无法知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2015-09-27
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多