Почему уведомление о моем имуществе не срабатывает? - PullRequest
0 голосов
/ 27 января 2019

У меня есть иерархия классов.Соответствующие биты включены ниже.Я ожидал, что при изменении FilterCritetionInteger.CriterionValue через привязку WPF я получу уведомление в моем FilterCriterionCollection.Но, хотя вызывается установщик FilterCriterionInteger.CriterionValue, метод FilterCriterionCollection.Criterion_PropertyChanged никогда не вызывается.

Видимо, я что-то неправильно понимаю или что-то неправильно подключено.Я просто не нахожу это.Почему мое уведомление не происходит?(Пожалуйста, дайте мне знать, если где-то нужно больше контекста.)

ViewModelBase

public abstract class ViewModelBase : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;

  protected virtual void OnPropertyChanged(string propertyName)
  {
    PropertyChangedEventHandler pcHandler = this.PropertyChanged;

    if (pcHandler != null)
    {
      PropertyChangedEventArgs args = new PropertyChangedEventArgs(propertyName);
      pcHandler(this, args);
     }
  }  
}

FilterCriterionBase

public abstract class FilterCriterionBase : ViewModelBase
{
  public abstract bool IsValid { get; }
}

FilterCriterionInteger

public class FilterCriterionInteger : FilterCriterionBase
{
  private string _criterionValue = "0";
  public string CriterionValue
  {
    get { return _criterionValue; }
    set
    {
      _criterionValue = value;
      OnPropertyChanged("IsValid");
    }
  }

  public int? MaxValue { get; private set; } = null;

  public override bool IsValid
  {
    get
    {
      if (int.TryParse(_criterionValue, out int i))
      {
        if (MaxValue.HasValue && (i > MaxValue)) return false;
      }
      else
      {
        return false;
      }

      return true;
    }
  }
}

FilterCriterionCollection

public class FilterCriteriaCollection : ViewModelBase
{
  public FilterCriteriaCollection()
  {
    Criteria.CollectionChanged += Criteria_CollectionChanged;
  }

  ~FilterCriteriaCollection()
  {
    Criteria.CollectionChanged -= Criteria_CollectionChanged;
  }

  public ObservableCollection<FilterCriterionBase> Criteria { get; private set; } = new ObservableCollection<FilterCriterionBase>();

  private void Criteria_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
  {
    switch (e.Action)
    {
      case NotifyCollectionChangedAction.Add:
        foreach (FilterCriterionBase fb in e.NewItems)
        {
          fb.PropertyChanged += Criterion_PropertyChanged;
        }
        break;

      case NotifyCollectionChangedAction.Remove:
        foreach (FilterCriterionBase fb in e.NewItems)
        {
          fb.PropertyChanged -= Criterion_PropertyChanged;
        }
        break;
    }
  }

  private bool _isValid;
  public bool IsValid
  {
    get { return _isValid; }
    private set { _isValid = value; OnPropertyChanged("IsValid"); }
  }

  private void Criterion_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
  {
    using (FilterCriterionBase criterion = sender as FilterCriterionBase)
    {
      switch (e.PropertyName)
      {
        case "IsValid":
          {
            bool isvalid = true;

            foreach(FilterCriterionBase fcb in Criteria)
            {
              isvalid = fcb.IsValid;
              if (!isvalid) break;
            }

            IsValid = isvalid;
            break;
          }
      }
    }
  }
}

1 Ответ

0 голосов
/ 27 января 2019

Итак, как оказалось, я дебил. Код, приведенный выше, нуждается в небольшой настройке, но в целом это звук. Моя основная проблема заключалась в том, что в тестовой песочнице у меня был некоторый оставшийся код от тестирования некоторой сериализации / десериализации JSON. После долгих ударов я понял, что отправляю десериализованные объекты, которые потеряли свой контекст уведомления о событии и, следовательно, больше не были в цикле.

Будет ли правильным протоколом просто удалить этот пост, так как он действительно не требует ответа, кроме двойной проверки ваших входных данных ...?

...