- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试 MVVM 模式基本级别,并在 ICommand CanExecute 更改时感到震惊。我有如下 XAML 绑定(bind):
<ListBox ItemsSource="{Binding Contact.Addresses}" x:Name="AddressCollections" Height="152" SelectedValue="{Binding SelectedAddress}"
DockPanel.Dock="Top" />
<Button Content="Add" Command="{Binding AddAddressCommand}" DockPanel.Dock="Top" />
<Button Content="Remove" Command="{Binding DeleteAddressCommand}" DockPanel.Dock="Bottom" />
Public Class DeleteCommand
Implements ICommand
Private method As Object
Private methodname As String
Public Sub New(ByVal Controlname As String, ByVal mee As Object)
methodname = Controlname
method = mee
End Sub
Public Function CanExecute(parameter As Object) As Boolean Implements ICommand.CanExecute
Select Case methodname
Case "Address"
Return TryCast(method, ModelView.Contacts.ContactMV).CanDeleteAddress()
Case "Numbers"
Return TryCast(method, ModelView.Contacts.ContactMV).CanDeleteNumbers
Case Else : Return False
End Select
End Function
Public Event CanExecuteChanged(sender As Object, e As EventArgs) Implements ICommand.CanExecuteChanged
Public Sub Execute(parameter As Object) Implements ICommand.Execute
Select Case methodname
Case "Address"
TryCast(method, ModelView.Contacts.ContactMV).DeleteAddress()
Case "Numbers"
TryCast(method, ModelView.Contacts.ContactMV).DeleteNumbers()
Case Else
End Select
End Sub
End Class
Public Class ContactMV
Property Contact As Model.Contacts.ContactMod
Property AddAddressCommand As New Commands.AddCommand("Address", Me)
Property DeleteAddressCommand As New Commands.DeleteCommand("Address", Me)
Property SelectedAddress As Model.Contacts.AddressModel
Public Sub AddAddress()
If Contact.Addresses.Count = 0 Then
Contact.Addresses.Add(New Model.Contacts.AddressModel(Contact.Primary.ID, True))
Else
Contact.Addresses.Add(New Model.Contacts.AddressModel(Contact.Primary.ID, False))
End If
End Sub
Public Sub DeleteAddress()
If IsNothing(SelectedAddress) = False Then
Try
Contact.Addresses.Remove(SelectedAddress)
Catch ex As Exception
MsgBox("Address not found")
End Try
End If
End Sub
Public Function CanDeleteAddress()
If IsNothing(SelectedAddress) Then
Return False
Else
Return Contact.Addresses.Contains(SelectedAddress)
End If
End Function
End Class
Public Class RelayCommand
Implements ICommand
''' <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>
''' <remarks></remarks>
#Region "Declarations"
Private ReadOnly _CanExecute As Func(Of Boolean)
Private ReadOnly _Execute As Action
#End Region
#Region "Constructors"
Public Sub New(ByVal execute As Action)
Me.New(execute, Nothing)
End Sub
Public Sub New(ByVal execute As Action, ByVal canExecute As Func(Of Boolean))
If execute Is Nothing Then
Throw New ArgumentNullException("execute")
End If
_Execute = execute
_CanExecute = canExecute
End Sub
#End Region
#Region "ICommand"
Public Custom Event CanExecuteChanged As EventHandler Implements System.Windows.Input.ICommand.CanExecuteChanged
AddHandler(ByVal value As EventHandler)
If _CanExecute IsNot Nothing Then
AddHandler CommandManager.RequerySuggested, value
End If
End AddHandler
RemoveHandler(ByVal value As EventHandler)
If _CanExecute IsNot Nothing Then
RemoveHandler CommandManager.RequerySuggested, value
End If
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
'This is the RaiseEvent block
'CommandManager.InvalidateRequerySuggested()
End RaiseEvent
End Event
Public Function CanExecute(ByVal parameter As Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute
If _CanExecute Is Nothing Then
Return True
Else
Return _CanExecute.Invoke
End If
End Function
Public Sub Execute(ByVal parameter As Object) Implements System.Windows.Input.ICommand.Execute
_Execute.Invoke()
End Sub
#End Region
End Class
最佳答案
正如 Raul Otaño 所指出的,您可以提高 CanExecuteChanged
.但是,并非所有 MVVM 框架都提供 RaiseCanExecuteChanged
方法。还值得注意的是,实际事件CanExecuteChanged
必须在 UI 线程上调用。因此,如果您期望模型中某个线程的回调,则需要将其调用回 UI 线程,如下所示:
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
Application.Current.Dispatcher.Invoke((Action)(() => { CanExecuteChanged(this, EventArgs.Empty); }));
}
}
CommandManager.InvalidateRequerySuggested()
因为虽然这在功能上有效,并且适用于小型应用程序,但它是不分青红皂白的,并且可能会重新查询每个命令!在具有大量命令的大型系统中,这可能非常非常慢!
关于wpf - ICommand CanExecuteChanged 未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19657463/
我可以使用 CanExecuteChanged 更改“可以执行”条件吗? 或者……它的用途是“什么”? 最佳答案 不,您不能使用它来更改可执行状态。它是参与ICommand 的事件和对象模式可以选择收
在我的 ViewModel 中,我有一个 ObservableCollection 的 Person 对象(实现了 INotifyPropertyChanged)和一个 SelectedPerson
我正在尝试 MVVM 模式基本级别,并在 ICommand CanExecute 更改时感到震惊。我有如下 XAML 绑定(bind): 命令: Public Class
我不知道如何使用 CanExecuteChangedEventManager在 MyCommand : ICommand 中。我尝试了以下但 value 是错误的类型: public event Ev
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 2 年前。 Improve this qu
Icommand 包含两个方法和一个事件。 两个方法的作用很清楚,但是我无法理解ICommand中提供的事件是做什么的。 CanExecuteChanged 事件何时引发? 下面的解释在MSDN但是我
在我的 WPF UI 中,我使用了我在 xaml 中通过以下代码引用的 RoutedCommands: Command="viewModel:MessageListViewModel.DeleteMe
我从 Josh Smith 的 MVVM tutorial 得到以下代码. 任何人都可以快速解释这段代码的实际作用吗? public event EventHandler CanExecuteChan
我正在分析一个使用 Catel 作为 MVVM 框架的 WPF 应用程序,我已经看到在 ViewModel 中我有 2 个保留路径作为 现在我在附加到上下文菜单的行为中创建了这样的 RadMenuIt
我正在使用 MVVM-Light 并且我的中继命令运行良好,我刚刚读到我应该实现 CanExecuteChanged和 CanExecute .虽然我找不到一个很好的例子。 有没有人有一个很好的例子来
我的 Command-ViewModel 中是否缺少某些内容? public class Command : ICommand { public Command(Action
我想实现当文本框值更改时,我的添加按钮可用。 我将文本框与 viewModel 绑定(bind): 我的按钮: 在后面的 XAML 代码中,我将 DataContext 设置为我的 ViewMod
在用户进行一些修改后,我想从 DelegateCommand 重新触发 canExecute 功能。我该怎么做呢? 最佳答案 必须引发接口(interface) ICommand 的事件 CanExe
我给自己写了一个 SingleExecutionCommand(我还不确定那个名字。请随意推荐另一个,但这不是我的问题),它不允许在第一次执行之前再次按下按钮完成的。好吧,至少那是计划。 我想使用 C
我是一名优秀的程序员,十分优秀!