110,538
社区成员
发帖
与我相关
我的任务
分享
public class RelayCommand<T>:ICommand
{
//定义执行命令成员和是否可执行命令成员
readonly Action<T> _execute;
readonly Func<T,bool> _canExecute;
//构造函数
public RelayCommand(Action<T> execute)
: this(execute, null)
{
}
public RelayCommand(Action<T> execute, Func<T,bool> canExecute)
{
if (execute == null)
throw new ArgumentNullException("RelayCommand执行命令不可预知");
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(T parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(T parameter)
{
_execute(parameter);
}
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute((T)parameter);
}
public void Execute(object parameter)
{
_execute((T)parameter);
}
}
public abstract class ViewModelBase : INotifyPropertyChanged,IDisposable
{
protected ViewModelBase() { }
~ViewModelBase() { }
//属性更改事件
public event PropertyChangedEventHandler PropertyChanged;
protected virtual bool ThrowOnInvalidPropertyName
{
get;
private set;
}
public void Dispose()
{
OnDispose();
}
protected virtual void OnDispose()
{
}
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
//this.VerifyPropertyName(propertyName);
var hanlder = this.PropertyChanged;
if (hanlder != null)
{
hanlder(this, e);
}
}
/// <summary>
/// 提示属性已更改
/// </summary>
/// <param name="propertyName">更改的属性名称</param>
public void RaisePropertyChanged(string propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
/// <summary>
/// 提示属性已更改
/// </summary>
/// <typeparam name="TProperty">更改的属性类型</typeparam>
/// <param name="expr">更改的属性表达式</param>
public void RaisePropertyChanged<TProperty>(Expression<Func<TProperty>> expr)
{
MemberExpression memberExpr = (MemberExpression)expr.Body;
string memberName = memberExpr.Member.Name;
RaisePropertyChanged(memberName);
}
[Conditional("DEBUG")]
[DebuggerStepThrough]
public void VerifyPropertyName(string propertyName)
{
if (TypeDescriptor.GetProperties(this)[propertyName] == null)
{
string msg = "无效的属性名称:"+propertyName;
if (this.ThrowOnInvalidPropertyName)
throw new Exception(msg);
else
Debug.Fail(msg);
}
}
}
public class MainWindowViewModel:ViewModelBase
{
private ICommand _closeMainWindow;
public ICommand CloseMainWindow
{
get
{
if (_closeMainWindow == null)
{
_closeMainWindow = new RelayCommand<Window>(CloseMainWindowAction,CanCloseMainWindowAction);
}
return _closeMainWindow;
}
}
private void CloseMainWindowAction(Window parameter)
{
if (MessageBox.Show("确定关闭客户端主窗口吗?", "长今提示", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{
parameter.Close();
}
}
private bool CanCloseMainWindowAction(Window parameter)
{
return true;
}
}
<Button Content="退出" Height="19" Name="BtnExit" Width="40" FontSize="14" Margin="5,5,0,0" Style="{StaticResource LinkBtnStyle}"
Template="{StaticResource LinkBtnTemp}" Command="{Binding CloseMainWindow}" CommandParameter="{Binding ElementName=MainWindow}"/>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Input;
using System.Diagnostics;
namespace STLogisticsRelayCommand
{
public class RelayCommand<T>:ICommand
{
//定义执行命令成员和是否可执行命令成员
readonly Action<T> _execute;
readonly Predicate<object> _canExecute;
//构造函数
public RelayCommand(Action<T> execute)
: this(execute, null)
{
}
public RelayCommand(Action<T> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("RelayCommand执行命令不可预知");
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(T parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public void Execute(T parameter)
{
_execute(parameter);
}
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute((T)parameter);
}
}
}
public void Execute(object parameter)
{
_execute((T)parameter);
}
这就不会报错,求大侠指点
public void Execute(object parameter)
{
_execute((T)parameter);
}
这就不会报错,求大侠指点