Изменение
<Button>
Для того, чтобы ...
<Button Command="{Binding OnClick}" />
В классе, который вы используете как элемент в этом ItemsControl, реализуйте свойство только для чтения, которое возвращает ICommand для кнопки, которую нужно использовать.
EDIT:
В этом примере я использовал реализацию ICommand под названием RelayCommand
, которая доступна по адресу http://msdn.microsoft.com/en-us/magazine/dd419663.aspx. См. Рисунок 3 этой статьи для полного класса RelayCommand
в C #. Я преобразовал его в Visual Basic для моего использования, этот код ниже. Он не более чем автоматизирует регистрацию команд в системе WPF и предоставляет вам удобный конструктор:
''' <summary>
''' Implements the ICommand interface
''' </summary>
''' <remarks>
''' Thanks to Josh Smith for this code: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
''' </remarks>
Public Class RelayCommand
Implements ICommand
#Region "Fields"
Private ReadOnly _execute As Action(Of Object)
Private ReadOnly _canExecute As Predicate(Of Object)
#End Region ' Fields
#Region "Constructors"
Public Sub New(ByVal execute As Action(Of Object))
Me.New(execute, Nothing)
End Sub
Public Sub New(ByVal execute As Action(Of Object), ByVal canExecute As Predicate(Of Object))
If execute Is Nothing Then
Throw New ArgumentNullException("execute")
End If
_execute = execute
_canExecute = canExecute
End Sub
#End Region ' Constructors
#Region "ICommand Members"
<DebuggerStepThrough()>
Public Function CanExecute(ByVal parameter As Object) As Boolean Implements ICommand.CanExecute
Return If(_canExecute Is Nothing, True, _canExecute(parameter))
End Function
Public Custom Event CanExecuteChanged As EventHandler Implements 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)
CommandManager.InvalidateRequerySuggested()
End RaiseEvent
End Event
Public Sub Execute(ByVal parameter As Object) Implements ICommand.Execute
_execute(parameter)
End Sub
#End Region ' ICommand Members
End Class
Используя этот класс, вы можете затем реализовать ICommand
s в вашей ViewModel, выставив ICommand
как свойство только для чтения в этом классе вместе с полем для хранения RelayCommand, который забудьте, реализует ICommand. Вот усеченный образец:
Public Class CompanyViewModel
Implements INotifyPropertyChanged
Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Private _OnClick As RelayCommand
Public ReadOnly Property OnClick As ICommand
Get
If _OnClick Is Nothing Then
_OnClick = New RelayCommand(Sub()
Me.OnClickExecute()
End Sub,
Function()
Return Me.OnClickCanExecute()
End Function)
End If
Return _OnClick
End Get
End Property
Private Function OnClickCanExecute() As Boolean
' put a test here to tell the system whether conditions are right to execute your command.
' OR, just return True and it will always execute the command.
End Function
Private Sub OnClickExecute()
' put the processing for your command here; THIS IS YOUR EVENT HANDLER
End Sub
' .... implement the rest of your ViewModel
End Class
Имя "OnClick" не обязательно; Команды могут принимать любое имя, потому что система не основана на соглашениях, как VB6 со своими обработчиками событий.
Существует несколько способов сделать это. Я заинтригован реализацией ICommand «Caliburn.Micro», которая основана на соглашениях и может сделать вещи более читабельными, в зависимости от вашего стиля. Но Caliburn - это открытая работа энтузиаста, хотя и очень компетентного и квалифицированного энтузиаста. Google или Bing "Caliburn.Micro" для получения дополнительной информации об этом.