当 Button.CommandProperty 为 null 时如何禁用按钮

2024-04-23

简短说明

Button.CommandProperty 绑定到 ViewModel 的 SomeObject.SomeCommand 属性。当 SomeObject 的 SomeCommand 属性设置为 null 或整个 SomeObject 属性设置为 null 时,此按钮保持启用状态。在这种情况下如何禁用该按钮?

详细解释

我正在使用 MVVM 创建应用程序,其行为类似于浏览器: 主 view_model(对应于主窗口视图)具有工作区 view_model 列表。每个Workspace view_model对应windows的TabControl中的TabPage。 主 view_model 具有 CurrentWorkspace 属性,该属性对应于当前活动的 TabPage。

在主窗口中,有一个带有按钮的工具栏,它利用当前工作区提供的命令。例如,重载工作区数据的访问实现为:

<Button Name="btReload" Content="Reload" 
        Command="{Binding Path=CurrentWorkspace.ReloadCommand, UpdateSourceTrigger=PropertyChanged}"/>

我尝试通过创建 DataTriggers 来完成按钮禁用的任务,但触发器似乎只在第一次起作用,不再起作用:

<Button Name="btReload" Content="Reload" 
        Command="{Binding Path=CurrentWorkspace.ReloadCommand, UpdateSourceTrigger=PropertyChanged}">
    <Button.Style>
        <Style>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=CurrentWorkspace, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
                     <Setter Property="dxb:BarButtonItem.IsEnabled" Value="False"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=CurrentPage.CurrentWorkspace, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
                    <Setter Property="dxb:BarButtonItem.IsEnabled" Value="False"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

它看起来真的很愚蠢:就像 MS Word 一样,具有无文档客户区,同时工具栏中有许多可供单击的按钮(具有格式设置和其他特定于文档的功能)。请帮我, :)

附:当向工具栏添加 DataContext 绑定到 CurrentWorkspace 的按钮时,在窗口中激活或添加或删除工作区选项卡时,其 DataContextChanged 事件会正确触发。因此,问题出在 DataTrigger 中(或通常在 View 中),而不是 ViewModel 中。

UPDATE

我在VS2010上上传了示例项目,存档链接:http://www.filefactory.com/file/b43455e/n/WhatIfCommandIsNull.rar http://www.filefactory.com/file/b43455e/n/WhatIfCommandIsNull.rar

下面是它的描述。

  1. TextBox 绑定到 ViewModel.Data 属性
  2. 将 ViewModel 分配到 Window.DataContext 或从 Window.DataContext 中删除 ViewModel 可以通过单击两个按钮来完成 - 分别是 btAssignViewModel 和 btRemoveViewModel
  3. ViewModel 公开两个命令,其中一个将 ViewModel.Data 设置为字符串值,另一个将其设置为 NULL
  4. 这些命令通过 Button.Command 属性绑定到按钮 btSetData 和 btResetData

正如您所看到的,当 Window.DataContext 设置为 ViewModel 实例时,两个命令都可以正常工作,并且 ResetDataCommand.CanExecute 也可以工作(当 ViewModel.Data 为 NULL 时,ResetDataCommand.CanExecute 返回 false 并且按钮 btResetData 被禁用)。一旦 Window.DataContext 设置为 null,最后两个按钮将启用(对于前两个按钮,没有绑定任何命令)。

问题是以声明方式(通过触发器)实现接下来的四个规则:

  • 如果 btAssignViewModel.DataContext 不为 null,则 btAssignViewModel.IsEnabled = false,否则为 true。
  • 如果 btRemoveViewModel.DataContext 为 null,则 btRemoveViewModel.IsEnabled = false,否则为 true。
  • 如果 ViewModel.Data 为 null,则 btSetData.IsEnabled = true,否则为 false。
  • 如果 ViewModel.Data 为 null,则 btResetData.IsEnabled = false,否则为 true。

我认为前两个规则可以使用触发器来实现,后两个规则可以使用数据触发器来实现。但它们不起作用,所以我将它们从项目中删除了。


这可能有效(取决于您的情况)

<Button.Style>
    <Style TargetType="{x:Type Button}">
        <Style.Triggers>
            <Trigger Property="Command" Value="{x:Null}">
               <Setter Property="IsEnabled" Value="false"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Button.Style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 Button.CommandProperty 为 null 时如何禁用按钮 的相关文章

  • 学习 WPF 会提高我的 ASP.NET 技能吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经在 Windows 窗体领域工作了很多年 而且仍然如此 我完全不熟悉 ASP NET 技术 也不熟悉其他 Web 相关技术 我曾合作过 O
  • 将无限范围的值映射到 10 种颜色?

    我有以下 10 种颜色的列表 public static readonly IList
  • 发生 XMLParseException

    对类型 WpfApplication1 MainWindow 的构造函数的调用 与指定的绑定约束匹配的抛出异常 行号 4 和行位置 9 这是我在将目标平台从 x86 更改为 任何 CPU 以便运行我的可执行文件以在 x86 和 x64 位
  • 以编程方式将内容添加到滚动查看器,滚动条停止工作

    好吧 我不太熟悉强大的 WPF 但我尝试了一个有趣的项目来跳入其中 我制作了一个简单的 RSS ATOM 提要查看器 它从 RRS 或 ATOM 提要中提取 HTML 并将其粘贴到浏览器控件中 该控件添加到堆栈面板中 这是 ScrollVi
  • Dispatcher.BeginInvoke() 未异步运行

    这是我想做的事情的简化版本 onClick abutton a aNewMethod 将异步运行以保持 UI 响应 就是这样 我读过一些答案 这是我能想到的 private async void button Click object se
  • WPF:如何以不同的方向书写文本?

    我需要按照下图指定的方向写入文本 事实上 我在这里看到了一些使用文本块并使用 RenderTransform 旋转控件角度的示例 但这不是我真正需要的 我尝试使用图像来做到这一点 但它不太适合 所以我真的不知道如何解决它 如果您查看旁边的图
  • 如何绑定到 IronPython 中的列表框?

    我刚刚开始在 WPF 中使用 IronPython 但我不太明白绑定应该如何完成 通常在 WPF 中我会这样做
  • 使用 MVVM 在 WPF 中打印 TreeView

    我有一个树视图来从文本文件返回文本搜索结果
  • 立即更新 UserControl 中的所有绑定

    当 UserControl 的可见性更改为 Visible 时 我需要更新其上的所有绑定 几乎所有绑定都绑定到用 户控件的 DataContext 属性 因此我尝试更新该绑定的目标 BindingOperations GetBindingE
  • 执行命令不会在后面的资源字典代码中触发

    我已经为其创建了资源字典和代码隐藏文件 在 XAML 中 我定义了命令绑定并添加了执行处理程序
  • Trace.Assert 没有中断,也不显示消息框

    我有一个 WPF 应用程序 我在其中在画布上移动数据 当我像怪物一样尝试用鼠标移动数据时 问题就开始了 以下是操作的顺序 画布上的 MouseMove 被触发 在 MouseMove 中 我更改了一些数据 Trace Assert 失败 调
  • 在单独的线程上显示 WPF-“NotifyIcon”

    我目前正在开发一个 Office 加载项 我需要显示一个显示进度的通知对话框 我正在使用Philipp Sumi 的 wpf notifyicon http www codeproject com Articles 36468 WPF No
  • 如何在不违反 MVVM 的情况下绑定到不可绑定的属性?

    我在用SharpVector 的 SvgViewBox https sharpvectors codeplex com 显示静态资源图像 如下所示
  • 将向量作为绑定传递给 for 宏时出现问题

    我有任意数量的列表 我想使用 for 宏来处理它们 我想创建一个传递向量作为绑定的函数 因为列表的数量各不相同 如果我对绑定进行硬编码 它会按我的预期工作 gt def list1 pink green gt def list2 dog c
  • 如何在样式中访问控件父级的属性

    我的列表视图将项目数据模板化为标签 我正在为该标签设计一种样式 但我不知道如何访问父级的 ListViewItem IsSelected 属性 编辑 尝试了下面的建议 但仍然出现异常 这是我的完整代码
  • WPF:什么会导致 ComboBox 无法虚拟化?

    这是我的组合框 它似乎没有虚拟化 但我不明白为什么 您知道有什么会导致这种情况吗
  • 如何将 TargetNullValue 设置为日期?

    我使用 WPF 工具包的日历控件来允许用户选择日期 如果尚未选择日期 则 SelectedDate 绑定到的属性为 Null 这使得日历默认为公元 0 年 1 月 1 日 我想做类似的事情 SelectedDate Binding User
  • Prism自定义确认交互

    我使用 Prism Unity WPF 和 Mvvm 在应用程序中创建了一个自定义确认窗口 我需要有关需要发送回视图模型的通知的帮助 我在详细记录视图中有这个 我们称之为 MyDetailView
  • 如何使用 wpf webbrowser 将数据发布到 Web 服务器

    我想从数据库获取数据并使用它来让用户登录到网站 我有一个包含 Web 浏览器控件的 wpf 页面 我有这样的代码 用于将用户登录到用 php 编写的网站
  • Windows 8 和 LOB 应用程序

    为 Windows 8 构建业务线应用程序的推荐方法是什么 例如复杂的定制财务应用程序 它们显然不适合 Metro 风格 因此可能会成为常规桌面应用程序 那么建议使用WPF吗 有 vNext 吗 我作为开发人员构建的应用程序类型是桌面风格的

随机推荐