使用mvvm实现click事件

时间:2015-06-17 12:35:05

标签: wpf vb.net mvvm

我想使用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

但是它不起作用,请告诉我应该在我的代码中做出的更改。

由于

2 个答案:

答案 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