wpf工具栏中的非活动命令
本文关键字:非活动 命令 工具栏 wpf | 更新日期: 2023-09-27 18:25:16
我有一个带有工具栏(添加和删除命令)和TabControl的应用程序。TabControl的每个tabItem中都有VariableGrid控件。
查看图片:http://trueimages.ru/view/cNFyf
<DockPanel >
<ToolBarTray DockPanel.Dock="Top">
<ToolBar>
<Button Command="{x:Static VariableGrid:VariableGrid.AddRowCommand}"/>
<Button Content="Delete" Command="ApplicationCommands.Delete" />
</ToolBar>
</ToolBarTray>
<TabControl x:Name="tc">
<TabItem Header="Tab 1">
<vg:VariableGrid ItemsSource="{Binding Items1, Mode=TwoWay}"/> </TabItem>
<TabItem Header="Tab 2">
<vg:VariableGrid ItemsSource="{Binding Items2, Mode=TwoWay}"/>
</TabItem>
</TabControl>
<DockPanel >
工具栏命令在我的控制下实现:
public partial class VariableGrid : DataGrid, INotifyPropertyChanged
{
public static RoutedCommand AddRowCommand = new RoutedCommand();
public VariableGrid()
{
this.CommandBindings.Add(new CommandBinding(VariableGrid.AddRowCommand, AddRow));
this.CommandBindings.Add(new CommandBinding(ApplicationCommands.Delete, R emoveRow, CanRemoveRow));
}
private void AddRow(object sender, ExecutedRoutedEventArgs e)
{
…
}
private void RemoveRow(object sender, ExecutedRoutedEventArgs e)
{
…
}
private void CanRemoveRow(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = (SelectedItems.Count > 0);
}
}
工具栏中的命令被禁用的情况很少:
- 应用程序运行时
- 当我点击DataGrid的灰色字段时
- 当DataGrid为空时
当DataGrid的任何一行被选中时,工具栏的命令将变为活动状态。
你能帮我解决我的问题吗?我应该设置工具栏按钮的CommandTarget?
PS:在我的应用程序中有两个VariableGrids。这就是为什么我不能将CommandTarget设置为"{Binding ElementName=variableGrid}"。我认为应该将其设置为FocusedElement。但我不知道该怎么做。
WPF应该每隔一段时间调用一次CanRemoveRow
方法,以检查是否可以删除一行。你应该在这个方法中放入一个布尔条件来回答这个问题。如果您希望AddRowCommand
具有类似的功能,请添加一个CanAddRow
方法来绑定AddRowCommand
。
您可能想要阅读MSDN上的命令概述。
更新>>>
哦。。。你想知道在这些禁用条件下使用什么代码吗?我想是这样的:
应用程序运行时
我猜你的意思是"当应用程序繁忙时"。。。添加一个名为IsBusy
的布尔属性,在应用程序执行任何长时间运行的进程时将其设置为true,然后将!IsBusy
添加到方法条件中。
当我点击DataGrid的灰色字段时
当DataGrid为空时
通过在方法条件中添加&& dataGrid.SelectedItem != null
,可以使用DataGrid
的SelectedItem
属性来判断这两个条件。
因此,您需要以下内容:
private void CanRemoveRow(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = !IsBusy && SelectedItem != null);
}