【问题标题】:PropertyChanged sets the old valuePropertyChanged 设置旧值
【发布时间】:2018-08-19 12:43:39
【问题描述】:

我有一个树视图,当某些项目标签发生更改时,它应该应用于所有子项。 我使用以下方法将标签应用于儿童:

    public void SetCLassificationForChildren(TreeItemViewModel item, Labels label)
    {
        if (item == null) return;

        item.Label = label;

        item.Children?.ForEach(c => SetCLassificationForChildren(c, label));
    }

这是一个 Label-property 和 INotifyPropertyChanged 的​​实现:

...
    public Labels Label
    {
        get => _label;
        set
        {
            _label = value;
            OnPropertyChanged(() => Label);
        }
    }

...
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged<T>(Expression<Func<T>> propertyExpression)
    {
        var body = propertyExpression.Body as MemberExpression;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(body.Member.Name));
    }

所以,当属性获得标签值时,会执行以下操作:

_label = value - 工作正常

但是,之后是下一行:

OnPropertyChanged(() => Label) 再次引发设置代码并设置旧值。

我不知道为什么会这样。

UPD“标签”是我的枚举类型:

public enum Labels
{
    NotClassified = 0,
    Internal,
    Confidential,
    StrictlyConf
}

【问题讨论】:

    标签: c# wpf mvvm inotifypropertychanged


    【解决方案1】:

    问题与转换器有关:

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null || !(bool)value) return null;
    
            string btnLabelString = parameter as string;
    
            Labels btnLabel;
    
            switch (btnLabelString)
            {
                case "internal":
                    btnLabel = Labels.Internal;
                    break;
                case "confidential":
                    btnLabel = Labels.Confidential;
                    break;
                case "strictlyConf":
                    btnLabel = Labels.StrictlyConf;
                    break;
                default:
                    btnLabel = Labels.NotClassified;
                    break;
            }
    
            return btnLabel;
        }
    

    它返回了旧值,但我添加了

    if (value == null || !(bool)value) return null;

    并在setter中处理了这个案例:

        public Labels Label
        {
            get => _label;
            set
            {
                if(value != null)
                {
                    _label = value;
                    OnPropertyChanged(() => Label);
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      Label-property 和 INotifyPropertyChanged 实现。

      private Labels _label;
      public Labels Label
      {
         get { return _label; }
         set
              {
                  if (value != null)
                  {
                      _label = value;
                      OnPropertyChanged("Label");
                  }
              }
      }
      public event PropertyChangedEventHandler PropertyChanged;
      protected void OnPropertyChanged(string propertyName)
      {
          PropertyChangedEventHandler handler = this.PropertyChanged;
          if (handler != null)
          {
              var e = new PropertyChangedEventArgs(propertyName);
              handler(this, e);
          }
      }
      protected void OnPropertyChanged<T>(Expression<Func<T>> propertySelector)
      {
          var propertyChanged = PropertyChanged;
          if (propertyChanged != null)
          {
              string propertyName = GetPropertyName(propertySelector);
              propertyChanged(this, new PropertyChangedEventArgs(propertyName));
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-20
        • 1970-01-01
        • 2013-03-25
        • 2018-05-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多