0

我有一個名爲EmployeeViewModel的ViewModel,它是從ViewModelBase繼承而來的。這裏是ViewModelBase的實現。PropertyChangedEventHandler在FirePropertyChanged中爲空

public event PropertyChangedEventHandler PropertyChanged; 
    public void FirePropertyChanged(string propertyname) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyname)); 
    } 
    public void FirePropertyChanged<TValue>(Expression<Func<TValue>> propertySelector) 
    { 
     if (PropertyChanged != null) 
     { 
      var memberExpression = propertySelector.Body as MemberExpression; 
      if (memberExpression != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(memberExpression.Member.Name)); 
      } 
     } 
    } 

我EmployeeViewModel有一個屬性名稱GridResults,這勢必會在視圖中格,這裏是屬性定義。

public PagedCollectionView GridResults 
    { 
     get { return _gridResults; } 
     set 
     { 
      _gridResults = value; 
      FirePropertyChanged(()=>GridResults); 
     } 
    } 

現在,當我在EmployeeViewModel代碼某處設置GridResults的值時,它觸發該屬性變化事件,並進入

FirePropertyChanged(式> propertySelector)

但是該方法其PropertyChangedEventHandler內部始終保持爲空,並阻止方法的完整執行。最終,我的Grid on View仍未被注意到其基礎項目源已被更改。

我錯過了什麼?

Thankx提前

-K9

回答

1

難道你真的ViewModelBase執行INotifyPropertyChanged?

如果是,請使用字符串參數嘗試FirePropertyChanged。

public PagedCollectionView GridResults 
{ 
    get { return _gridResults; } 
    set 
    { 
     _gridResults = value; 
     FirePropertyChanged("GridResults"); 
    } 
} 

BTW這裏是INPCBase類別I:

/// <summary> 
/// Basisklasse für INotifyPropertyChanged. 
/// </summary> 
public class INPCBase : INotifyPropertyChanged 
{ 
    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    /// <summary> 
    /// Notify mittels PropertyInfo. HINWEIS: diese Variante ist ungefähr 3x langsamer wie 
    /// <see cref="NotifyPropertyChanged(string)"/> bzw. <see cref="NotifyPropertyChanged(System.ComponentModel.PropertyChangedEventArgs)"/>. 
    /// </summary> 
    /// <example> 
    /// <code> 
    /// public string InfoMessage 
    /// { 
    ///  get {return this.infomessage;} 
    ///  set 
    ///  { 
    ///   this.infomessage = value; 
    ///   this.NotifyPropertyChanged(()=> this.InfoMessage); 
    ///  } 
    /// } 
    /// </code> 
    /// </example> 
    /// <typeparam name="T"></typeparam> 
    /// <param name="property"></param> 
    protected void NotifyPropertyChanged<T>(Expression<Func<T>> property) 
    { 
     var propertyInfo = ((MemberExpression)property.Body).Member as PropertyInfo; 

     if (propertyInfo == null) 
     { 
      throw new ArgumentException("The lambda expression 'property' should point to a valid Property"); 
     } 

     this.VerifyPropertyName(propertyInfo.Name); 

     var handler = PropertyChanged; 

     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyInfo.Name)); 
    } 

    /// <summary> 
    /// Notify using pre-made PropertyChangedEventArgs 
    /// </summary> 
    /// <param name="args"></param> 
    protected void NotifyPropertyChanged(PropertyChangedEventArgs args) 
    { 
     this.VerifyPropertyName(args.PropertyName); 

     var handler = PropertyChanged; 

     if (handler != null) 
     { 
      handler(this, args); 
     } 
    } 

    /// <summary> 
    /// Notify using String property name 
    /// </summary> 
    protected void NotifyPropertyChanged(String propertyName) 
    { 
     this.VerifyPropertyName(propertyName); 

     var handler = PropertyChanged; 

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

    #endregion 

    #region Debugging Aides 

    /// <summary> 
    /// Warns the developer if this object does not have 
    /// a public property with the specified name. This 
    /// method does not exist in a Release build. 
    /// </summary> 
    [Conditional("DEBUG")] 
    [DebuggerStepThrough] 
    public void VerifyPropertyName(string propertyName) 
    { 
     // Verify that the property name matches a real, 
     // public, instance property on this object. 
     if (TypeDescriptor.GetProperties(this)[propertyName] != null) 
      return; 

     var msg = "Invalid property name: " + propertyName; 

     if (this.ThrowOnInvalidPropertyName) 
      throw new Exception(msg); 

     Debug.Fail(msg); 
    } 

    /// <summary> 
    /// Returns whether an exception is thrown, or if a Debug.Fail() is used 
    /// when an invalid property name is passed to the VerifyPropertyName method. 
    /// The default value is false, but subclasses used by unit tests might 
    /// override this property's getter to return true. 
    /// </summary> 
    protected virtual bool ThrowOnInvalidPropertyName { get; private set; } 

    #endregion // Debugging Aides 
} 
相關問題