Неактивные команды в панели инструментов wpf

У меня есть приложение с панелью инструментов (команды Add и Delete) и TabControl. Существует элемент управления VariableGrid в каждом tabItem элемента TabControl.

Посмотрите изображение на: 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 пуст

Когда выбран какой-либо ряд DataGrid - команды панели инструментов становятся активными.

Можете ли вы помочь мне с моей проблемой? Какой CommandTarget кнопок панели инструментов я должен установить?

PS: в моем приложении есть две переменные сетки. Вот почему я не могу установить CommandTarget как "{Binding ElementName=variableGrid}". Я думаю, что это должно быть установлено в FocusedElement. Но я не знаю, как это сделать.

1 ответ

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);
}
Другие вопросы по тегам