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
-
文本框已绑定到ViewModel.Data属性
-
在Window.DataContext中分配或删除ViewModel可以通过分别单击两个按钮btAssignViewModel和btRemoveViewModel来完成
-
ViewModel公开两个命令,其中一个命令将ViewModel.Data设置为字符串值,另一个命令将其设置为空
-
这些命令通过按钮绑定到按钮btSetData&btResetData
问题是以声明的方式(通过触发器)实现以下四个规则:
-
如果btAssignViewModel.DataContext不为空,则btAssignViewModel.IsEnabled=false,否则为true。
-
如果btRemoveViewModel.DataContext为空,则btRemoveViewModel.IsEnabled=false,否则为true。
-
-
如果ViewModel.Data为空,则btResetData.IsEnabled=false,否则为true。
我认为前两个规则可以用触发器实现,后两个规则可以用数据触发器实现。但它们不起作用,所以我把它们从项目中删除了。