ICommand CanExecuteChanged 未更新

2023-12-13

我正在尝试 MVVM 模式基础级别,并对 ICommand CanExecute 更改感到震惊。我的 XAML 绑定如下:

    <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

问题是 Canexecutechanged 仅在开始时触发,实际上我想仅在选择列表框中的某些内容时启用删除按钮,并且我想通过 MVVM - ICommand 绑定方法来完成它。您能否解释一下我哪里出错了或者错过了对 ICommand 实现的理解。

谢谢。

我使用的更新的中继 iCommand 代码:

    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()因为虽然这可以正常工作,并且对于小型应用程序来说是可以的,但它是不加区别的,并且可能会重新查询每个命令!在具有大量命令的大型系统中,这可能非常非常慢!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ICommand CanExecuteChanged 未更新 的相关文章

  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 使一个对象只能被同一程序集中的另一个对象访问?

    每个业务对象都有一个包含 sql 调用的匹配对象 我想限制这些 sql 对象 使其只能由匹配的业务对象使用 如何才能实现这一目标 Update 格雷格提出了关于可测试性的观点 由于 SqlObjects 将包含非常特定于业务流程的 sql
  • Wpf TextBlock 中的垂直文本

    是否可以垂直显示 TextBlock 中的文本 以便所有字母彼此堆叠 不使用 LayoutTransform 旋转 还没有人提到使用纯 XAML 垂直堆叠任意字符串的字母 不旋转它们 的明显而简单的方法
  • 如何? WPF 窗口 - 最大化,不调整大小/移动

    我正在尝试创建一个已最大化打开的 WPF 窗口 无需调整大小 移动 在系统菜单中 也不在边框中 它应该一直最大化 除非用户最小化它 我尝试将 WindowState Maximized 和 ResizeMode CanMinimize 放在
  • WPF 绑定 CompositeCollection 中的 MenuItem 不起作用

    我在将命令绑定到复合集合中的菜单项时遇到问题 这MenuItem是其一部分ContextMenu这是定义在UserControl Resources 问题是新标签的绑定不起作用 当我将 MenuItem 放置在复合集合之外时 它将起作用 有
  • UDP SocketException - 通常只允许每个套接字地址使用一次

    尽管这里有很多非常相似的问题 但提供的答案都没有帮助我 这让我很难过 我有一个非常大的管理系统 我的任务是为其编写一些 UDP 数据包发送 接收 我已经编写了一个原型 一切都很好 所以我开始将我的代码合并到所述系统中 然而 我现在弹出了一个
  • WPF ListView/Gridview 允许用户选择多个项目并将它们分组在一起

    我在 MVVM 应用程序中有一个 WPF ListView GridViwe GridView 绑定到 ViewModel 中的列表 要求是用户应该能够选择网格视图的多行 右键单击它并看到上下文菜单 将这些行组合在一起 选择后 所有这些项目
  • F# 之于 IronPython/IronRuby 就像 C# 之于 VB.NET 一样?

    我刚刚听了Chris Smith 谈论 F 的播客 http www code magazine com codecast index aspx messageid 7feb501f 25c8 432a 9624 97082f1e75e8他
  • WithEvents(句柄)与 AddHandler 之间的区别

    我搜索了关键字使用的差异Handles http msdn microsoft com en us library 6k46st1y aspx代替添加处理程序 http msdn microsoft com en us library 7t
  • 如何枚举控件的所有依赖属性?

    我有一些 WPF 控件 例如 文本框 如何枚举该控件的所有依赖属性 如 XAML 编辑器所做的那样 不需要使用反射 恕我直言 这是一个坏主意 因为框架已经为此提供了实用程序类 但它们并不明显找到 以下是基于这篇文章的答案 枚举绑定 http
  • 如何以编程方式调用应用程序菜单?

    我有自定义样式的非矩形透明窗口
  • 为什么 True 等于 -1

    我想知道为什么 True 等于 1 而不是 1 如果我没记错的话 以前 在 C 语言中 true 将等于 1 Dim t f As Integer t True f False Console WriteLine t 1 Console W
  • 从一张图像复制 ROI 并复制到 wpf 中的另一张图像

    我想开发一个具有以下签名的函数 CopyImage ImageSource inputImage Point inTopLeft Point InBottomRight ImageSource outputImage Point outTo
  • WPF 创建同级窗口并关闭当前窗口

    我需要的是我的窗口类中的这样一个事件处理程序 void someEventHandler object sender RoutedEventArgs e MyNewWindow mnw new MyNewWindow mnw Owner W
  • 强制 IDataErrorInfo 验证

    我在某个面板上有两个控件 文本框和组合框
  • 阻止 WPF 文本框增长

    我花了两个小时研究如何避免在输入长文本时我的 WPF TextBox 控件变长 但我无法做到这一点 即使我读过一些关于它的答案 如下所示 停止 wpf textbox from grow with text https stackoverf
  • 重写某些 .Net Framework 控件的绘制以更改其边框颜色?

    SCENARIO 我正在使用第三方 Windows 视觉主题 当我看到我的应用程序时 它看起来像这样 但是当我使用正常的Aero主题 它看起来到处都有可怕的白色边框 QUESTION 我知道应用程序中使用的配色方案取决于视觉风格 但是 我可
  • 列表框未使用绑定填充

    我正在尝试使用 mvvm 模式将现有程序转换为 c wpf 第一部分是选择要处理的文件的文件夹位置并填充列表框 我在这里找到了一个使用 Mvvm Light 的示例 WPF OpenFileDialog 与 MVVM 模式 https st
  • 在 VB.Net 中将字节数组转换为整数

    我想知道在 vb net 中将字节数组 长度 4 转换为整数的最佳方法是什么 我知道 BitConverter 但执行函数调用来执行应该可以通过复制 4 字节内存来完成的操作似乎相当浪费 同样 将单 双精度数从二进制表示形式转换为单 双精度
  • Visual Basic - 未将对象引用设置为对象的实例

    我在 VB Net 中收到以下错误 你调用的对象是空的 它在 For 循环末尾突出显示 Next 任何帮助都会很棒 Imports System IO Public Class LoginForm Dim Username As Strin

随机推荐

  • 如何使用SSE2/SSE3/SSE4处理24位3通道彩色图像?

    我刚开始使用SS2优化图像处理 但对于3通道24位彩色图像没有任何想法 我的pix数据是按BGR BGR BGR unsigned char 8 bi排列的 所以如果我想用SSE2 SSE3 SSE4的指令C C fun来实现Color2G
  • 仅应用jquery mobile 页面的一部分?

    我有一个示例页面 我们设计得很好 现在 我们只需要在页面的一部分中使用 jquery mobile 问题是 当我添加 jquery mobile 时 它 弄乱了我所有的 UI 内容 有没有办法只应用 jquery mobile 页面的一部分
  • 如何使用 Apache POI 设置数据透视表字段编号格式单元格

    我想设置数字格式单元格数据透视表的值字段余额总和 as 0 使用基于代码创建的数据透视表官方 POI 示例 CreatePivotTable 下面的代码做create and get CTPivotField pivotField 但如何设
  • Karate - 嵌套 JSON 对象模式验证导致 KarateException

    Feature Test Karate schema validation Scenario Test nested json objects def response read tasks json def schema ab strin
  • JSF 后退按钮 [重复]

    这个问题在这里已经有答案了 如何创建一个链接 将用户导航回一页 即与单击浏览器后退相同 Thanks 重点是 只需记住上一页的请求 URL 或 JSF viewId 以便您可以在输出 命令链接的 href 或值中使用它 有多种方法可以实现它
  • 如何获取包含的 FXML 的控制器?

    我有一个围绕 Java FXML 和 scenebuilder 构建的简单的两个选项卡应用程序 这些选项卡目前什么也不做 因为我在尝试加载它们时无法克服空指针异常 java 和 fxml 文件在 Netbeans 项目中的排列如下 主应用程
  • 如何在 GRid 视图的一列中显示两个属性 asp.net C#

    我有类 Person 有两个属性名字和姓氏 如果我将人员数组设置为 GridView 的数据源 如何在一列中显示名字和姓氏 Thanx 使用模板字段和 Eval 方法
  • 尽情玩耍!框架

    我们正在计划一个主要为移动应用程序提供内容的项目 但需要有一个网站 我的问题是 使用 Jersey 或 Restlet 为我们的移动应用程序开发 REST API 然后使用 Play 是否有意义 为网站提供服务 或者直接使用 Play 是否
  • 如何使用 iCloud 同步我的 sqlite 数据库和驻留在应用程序库文件夹中的文件夹中的图像

    我的要求是 我正在开发的应用程序在驻留在应用程序文件夹中的 Library 文件夹中创建一个名为 Private docmunets 的文件夹 该文件夹中有图像和一个 sqlite 文件 用于记录用户条目和图像 我必须启用我的应用程序 iC
  • 使用套接字进行 TCP 连接返回错误结果

    这是我用来扫描端口是否打开的代码 https stackoverflow com a 8957053 2203703 有人可以尝试修复它吗 似乎无法正常工作 即使端口关闭 代码也总是返回 成功连接 这是我用端口 80 测试过的 IP 列表
  • glutBitmapCharacter 位置文本错误

    我正在尝试在屏幕上绘制一个简单的字符串 覆盖 根据我在互联网上找到的信息 我是这样使用的 void write string text int x int y glRasterPos2i x y for int i 0 i lt text
  • R Bioconductor 安装错误 - 以“< DOCTYPE html PUBLI ...”开头的行格式错误

    我在 R 中安装 bioconductor 包时遇到问题 这是在 MacOSX 上 全新安装 R 2 15 并使用 bioconductor 1 4 4 文字记录如下 gt source http bioconductor org bioc
  • 自 Rails3 升级以来对空 params[] 哈希进行故障排除

    我有一个命名路由 可以在控制台中正确测试并显示应该包含在 params 中的 url title 但 params 始终为空 问题是 为什么 params 为空 我的期望是它应该有 params url title 我还删除了这条路线并使用
  • 致命:需要一次修改

    我的仓库有 3 次提交 我想压缩为一 I ran git rebase i HEAD 3并得到这个错误 fatal Needed a single revision invalid upstream HEAD 3 我能够跑git rebas
  • 创建一个包含 R 中多个矩阵的平均值的矩阵[重复]

    这个问题在这里已经有答案了 我有多个具有相同尺寸的矩阵 如下所示 gt A x y z 1 2 4 3 2 1 5 7 gt B x y z 1 4 3 3 2 1 8 7 gt C x y z 1 4 3 3 2 1 8 7 gt 如何创
  • VBA listobject不会添加行

    我有一个带有几张表的工作表 每张表都有两个表 listobjects 我还有一个用户窗体 允许用户在表中添加 编辑 删除行 这些表是静态的 这意味着它们永远存在并且永远不会被删除 它们位于同一位置并且永远不会移动 我还以不同的方式 通过索引
  • 分层抽样 - 观察不足

    我想要实现的是从每组中获取 10 的样本 这是 2 个因素的组合 新近度和频率类别 到目前为止我已经考虑过包裹sampling和功能strata 这看起来很有希望 但我收到以下错误 并且很难理解错误消息以及错误所在或如何解决此问题 这是我的
  • 如何卸载新 WooCommerce 2.3.x 加载的 select2 脚本/样式?

    我们是主题开发人员 我们已经使用 select2 http select2 github io 我们的 WordPress 主题中 HTML 中的 SELECT 框的脚本 刚刚发布的新 WooCommerce 2 3 x 现在也使用 sel
  • MSChart / Asp.net 图表不显示工具提示

    我有一个仪表板页面 我在其中使用各种 MSCharts 我为每个图表定义了一个类 当我运行每个图表类并定义其系列属性时 我在该图表中定义系列的工具提示 如下所示 Series 0 ToolTip Date VALX d nTotal Qty
  • ICommand CanExecuteChanged 未更新

    我正在尝试 MVVM 模式基础级别 并对 ICommand CanExecute 更改感到震惊 我的 XAML 绑定如下