Неактивные команды в панели инструментов 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);
}
}
Есть несколько случаев, когда команды на панели инструментов отключены:
- когда приложение работает
- когда я нажимаю на серое поле DataGrid
- когда 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);
}