0

我有带有工具栏(添加和删除命令)和 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);
    }
}

工具栏中的命令被禁用的情况很少:

  1. 当应用程序运行时
  2. 当我单击 DataGrid 的灰色字段时
  3. 当 DataGrid 为空时

When any row of DataGrid is selected - commands of toolbar are becoming active.

你能帮我解决我的问题吗?我应该设置什么 CommandTarget 的工具栏按钮?

PS:我的应用程序中有两个 VariableGrids。这就是为什么我不能将 CommandTarget 设置为“{Binding ElementName=variableGrid}”。我认为它应该设置为 FocusedElement。但我不知道该怎么做。

4

1 回答 1

0

WPF 应该CanRemoveRow每隔一段时间调用你的方法来检查是否可以删除一行。您应该在此方法中放置一个布尔条件来回答该问题。如果您想要类似的功能,请AddRowCommand添加一个CanAddRow绑定AddRowCommand.

可能想阅读 MSDN 上的命令概述

更新>>>

哦...你想知道这些禁用条件使用什么代码吗?我会这样假设:

当应用程序运行时

我猜你的意思是'当应用程序很忙'......添加一个名为的布尔属性IsBusy,当应用程序执行任何长时间运行的进程时将其设置为 true,然后添加!IsBusy到您的方法条件中。

当我单击 DataGrid 的灰色字段时

当 DataGrid 为空时

通过添加到您的方法条件中,可以使用 的SelectedItem属性来判断这两个条件。DataGrid&& dataGrid.SelectedItem != null

因此,您需要以下内容:

private void CanRemoveRow(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = !IsBusy && SelectedItem != null);
}
于 2013-07-29T11:58:24.540 回答