gpt4 book ai didi

wpf - 当 Button.CommandProperty 为空时如何禁用按钮

转载 作者:行者123 更新时间:2023-12-04 14:51:54 25 4
gpt4 key购买 nike

简短说明

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

详细解释

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

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

<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 绑定(bind)到 CurrentWorkspace 的按钮添加到工具栏时,其 DataContextChanged 事件会在窗口中激活或添加或删除工作区选项卡时正确触发。因此,问题在 DataTrigger(或一般在 View 中)的某个地方,而不是在它的 ViewModel(s) 中。

更新

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

如下其描述。
  • TextBox 绑定(bind)到 ViewModel.Data 属性
  • 可以通过单击两个按钮来将 ViewModel 分配到 Window.DataContext 或从 Window.DataContext 中删除 - btAssignViewModel 和 btRemoveViewModel 分别
  • ViewModel 公开了两个命令,其中一个将 ViewModel.Data 设置为字符串值,另一个 - 将其设置为 NULL
  • 这些命令通过它们的 Button.Command 属性
  • 绑定(bind)到按钮 btSetData 和 btResetData

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

    问题在于以声明方式(通过触发器)实现接下来的四个规则:
  • 如果 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。

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

    最佳答案

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

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

    关于wpf - 当 Button.CommandProperty 为空时如何禁用按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4138026/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com