好写一个新的命令impelements的ICommand似乎有点超必杀看看这个类: VB.NET: 公共类RelayCommand 器具的ICommand
#Region " Declarations"
Private mCanExecute As Predicate(Of Object)
Private mExecute As Action(Of Object)
#End Region
#Region " Constructors"
Public Sub New(ByVal canExecute As Predicate(Of Object), ByVal execute As Action(Of Object))
mCanExecute = canExecute
mExecute = execute
End Sub
Public Sub New(ByVal execute As Action(Of Object))
mCanExecute = Nothing
mExecute = execute
End Sub
#End Region
#Region " Events"
Public Custom Event CanExecuteChanged As EventHandler Implements System.Windows.Input.ICommand.CanExecuteChanged
AddHandler(ByVal value As EventHandler)
AddHandler CommandManager.RequerySuggested, value
End AddHandler
RemoveHandler(ByVal value As EventHandler)
RemoveHandler CommandManager.RequerySuggested, value
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
Throw New ApplicationException("Can't raise custom command!")
End RaiseEvent
End Event
#End Region
#Region " Public Methods"
Public Function CanExecute(ByVal parameter As Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute
If (mCanExecute Is Nothing) Then
Return True
End If
Return mCanExecute(parameter)
End Function
Public Sub Execute(ByVal parameter As Object) Implements System.Windows.Input.ICommand.Execute
mExecute(parameter)
End Sub
#End Region
End Class
C#
public class RelayCommand : ICommand
{
#region Declarations
private Predicate<object> mCanExecute;
private Action<object> mExecute;
#endregion
#region Constructors
public RelayCommand(Predicate<object> canExecute, Action<object> execute)
{
mCanExecute = canExecute;
mExecute = execute;
}
public RelayCommand(Action<object> execute)
{
mCanExecute = null;
mExecute = execute;
}
#endregion
#region Events
public event EventHandler CanExecuteChanged {
add {
CommandManager.RequerySuggested += value;
}
remove {
CommandManager.RequerySuggested -= value;
}
}
#endregion
#region Public Methods
public bool CanExecute(object parameter)
{
if ((mCanExecute == null)) {
return true;
}
return mCanExecute(parameter);
}
public void Execute(object parameter)
{
mExecute(parameter);
}
#endregion
}
并使用它只是公开一个ICommand类型的属性,该属性返回一个新的RelayCommand,其中包含委托给一个函数...
vb.net
Private mDeleteCommand As ICommand
Public ReadOnly Property DeleteCommand() As ICommand
Get
If (mDeleteCommand Is Nothing) Then
mDeleteCommand = New RelayCommand(AddressOf CanDeleteTodo, AddressOf DeleteTodo)
End If
Return mDeleteCommand
End Get
End Property
C#
private ICommand mDeleteCommand;
public ICommand DeleteCommand {
get {
if ((mDeleteCommand == null)) {
mDeleteCommand = new RelayCommand(CanDeleteTodo, DeleteTodo);
}
return mDeleteCommand;
}
}
你太对了! – Faruz 2010-02-24 10:10:27
也许你可以将你的抱怨/怀疑变成一个问题? – 2010-02-24 10:26:53
这个问题是我错过了有关MVVM的东西,还是有更好的方法? – 2010-02-24 10:30:35