代码之家  ›  专栏  ›  技术社区  ›  JSP

如何在button.CommandProperty为空时禁用button

  •  6
  • JSP  · 技术社区  · 14 年前

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

    我正在使用MVVM创建应用程序,它的行为类似于浏览器: 主视图模型(对应于主窗口作为视图)有一个工作区视图模型列表。每个工作区视图模型都对应于windows的TabControl中的TabPage。 主视图模型具有与当前活动选项卡页相对应的CurrentWorkspace属性。

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

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

    我试图通过创建DataTriggers来完成禁用按钮的任务,但似乎triggers只在第一次工作,不再工作:

    <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一样,它有无文档的客户端,同时工具栏上有很多可随时点击的按钮(有格式和其他文档特定的功能)。求你了,帮帮我,:)

    P、 当向工具栏添加一个绑定了当前工作区的DataContext按钮时,当激活或添加或删除窗口中的工作区选项卡时,它的DataContextChanged事件将正确触发。所以,问题出在DataTrigger中(或者通常是视图中),而不是它的ViewModel中。

    更新

    http://www.filefactory.com/file/b43455e/n/WhatIfCommandIsNull.rar

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

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

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

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

    1 回复  |  直到 14 年前
        1
  •  7
  •   Goblin    14 年前

    这可能有用(在你的情况下)

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