我想使用MVVM模式实现click事件。我所做的代码如下: - 在xaml文件中: -
添加了命名空间
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
然后添加
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding ButtonClickCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
并从按钮中删除了点击事件
在xaml.vb页面内
Public Sub New()
InitializeComponent()
Me.DataContext = New CoverageViewModel
End Sub
在我的viewmodel页面
中 Public ReadOnly Property ButtonClickCommand() As ICommand
Get
Return New DelegateCommand(Of Object)(AddressOf ButtonClicked)
End Get
End Property
Public Sub ButtonClicked(obj As Object)
Dim class As New Myclass
If (Globals.IsEdited = False) Then
'My Code
End If
End Sub
但是它不起作用,请告诉我应该在我的代码中做出的更改。
由于
答案 0 :(得分:0)
你真的想为此使用relaycommand。
首先将以下内容添加到您的项目中:
Imports System.Windows.Input
''' <summary>
''' A command whose sole purpose is to
''' relay its functionality to other
''' objects by invoking delegates. The
''' default return value for the CanExecute
''' method is 'true'.
''' </summary>
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"
''' <summary>
''' Creates a new command that can always execute.
''' </summary>
''' <param name="execute">The execution logic.</param>
Public Sub New(ByVal execute As Action(Of Object))
Me.New(execute, Nothing)
End Sub
''' <summary>
''' Creates a new command.
''' </summary>
''' <param name="execute">The execution logic.</param>
''' <param name="canExecute">The execution status logic.</param>
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 System.Object, ByVal e As System.EventArgs)
End RaiseEvent
End Event
Public Sub Execute(ByVal parameter As Object) Implements ICommand.Execute
_execute(parameter)
End Sub
#End Region ' ICommand Members
End Class
现在,在xaml中,您将以下内容放入描述按钮的xaml中
Command={Binding Path=MyButtonClickCommand}
现在,在您的视图用作datacontext的viewmodel中添加以下内容:
Private _myButtonClickCommand As ICommand
Public ReadOnly Property MyButtonClickCommand As ICommand
Get
if _myButtonClickCommand Is Nothing Then
Dim myMyButtonClick As New Action(Of Object)(AddressOf MyButtonClick)
_myButtonClickCommand = New RelayCommand(myMyButtonClick)
End If
Return _myButtonClickCommand
End Get
End Property
Private Sub MyButtonClick(ByVal obj As Object)
'Add code here to do want you want doing when the button is clicked
End Sub
您可以将此原则应用于各种事物。我强烈建议您阅读Josh Smiths关于此here
的最终文章答案 1 :(得分:0)
尝试使用以下代码
Dim _ButtonClickCommand As DelegateCommand(Of Object)
Public ReadOnly Property ButtonClickCommand() As DelegateCommand(Of Object)
Get
If _ButtonClickCommand Is Nothing Then
_ButtonClickCommand = New DelegateCommand(Of Object) _
(AddressOf OnButtonClickCommandExecute, AddressOf OnButtonClickCommandCanExecute)
End If
Return _ButtonClickCommand
End Get
End Property
Sub OnButtonClickCommandExecute(ByVal parameter As Object)
''Your Button Click Logic
End Sub
Function OnButtonClickCommandCanExecute(ByVal parameter As Object) As Boolean
Return true
End Function