public class ViewModelCollection<T> : ObservableCollection<T>
    {
        
public ViewModelCollection()
            : 
base()
        {

        }

        
public new event PropertyChangedEventHandler PropertyChanged;

        
public new void Add(T item)
        {

            ((INotifyPropertyChanged)item).PropertyChanged 
+= (sender, e) =>
                {
                    
if (PropertyChanged != null)
                    {
                        PropertyChanged(sender, 
new PropertyChangedEventArgs(e.PropertyName));
                    }
                };
            
base.Add(item);
        }
    }

 

 

 public class RelayCommand : ICommand
    {
        
private Action _handler;
        
public RelayCommand(Action handler)
        {
            _handler 
= handler;
        }

        
private bool _isEnabled;
        
public bool IsEnabled
        {
            
get { return _isEnabled; }
            
set
            {
                
if (value != _isEnabled)
                {
                    _isEnabled 
= value;
                    
if (CanExecuteChanged != null)
                    {
                        CanExecuteChanged(
this, EventArgs.Empty);
                    }
                }
            }
        }

        
public bool CanExecute(object parameter)
        {
            
return IsEnabled;
        }

        
public event EventHandler CanExecuteChanged;

        
public void Execute(object parameter)
        {
            _handler();
        }
    }
 
 
public class Employee : INotifyPropertyChanged

{

    public event PropertyChangedEventHandler PropertyChanged;



    private string _firstName;

    public string FirstName 

    {

       get { return this._firstName; }

       set

       {

          this._firstName = value;

          this.PropertyChanged.Notify(()=>this.FirstName);

       }

    }

}
 
 
public static class NotificationExtensions
    {
        public static void Notify(this PropertyChangedEventHandlereventHandler, Expression<Func<object>> expression)
        {
            if( null == eventHandler )
            {
                return;
            }
            var lambda = expression as LambdaExpression;
            MemberExpression memberExpression;
            if (lambda.Body is UnaryExpression)
            {
                var unaryExpression = lambda.Body as UnaryExpression;
                memberExpression = unaryExpression.Operand asMemberExpression;
            }
            else
            {
                memberExpression = lambda.Body as MemberExpression;
            }
            var constantExpression = memberExpression.Expression asConstantExpression;
            var propertyInfo = memberExpression.Member as PropertyInfo;
            
            foreach (var del in eventHandler.GetInvocationList())
            {
                del.DynamicInvoke(new object[] {constantExpression.Value, newPropertyChangedEventArgs(propertyInfo.Name)});
            }
        }
   }

 

posted on 2009-06-15 16:46  fenix  阅读(209)  评论(0编辑  收藏  举报