WPF: как включить команду? - PullRequest
2 голосов
/ 28 февраля 2011

Я не знаю, почему пункт «Добавить» в моем контекстном меню активен, только если в ListView выбран элемент Кто-нибудь знает почему?

Вот мой код XAML

    <Window x:Class="Vokabular1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid HorizontalAlignment="Stretch" Name="grid" VerticalAlignment="Stretch">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>

            <ListView Grid.Column="0" HorizontalAlignment="Stretch" Margin="10,10,10,10" Name="listView" VerticalAlignment="Stretch">
                <ListView.View>
                    <GridView />
                </ListView.View>
                <ListView.CommandBindings>
                    <CommandBinding Command="New" 
                        Executed="CommandBinding_Executed" 
                        CanExecute="CommandBinding_CanExecute" />
                </ListView.CommandBindings>
                <ListView.ContextMenu>
                    <ContextMenu>
                        <MenuItem Name="Add" Header="_Add"    Command="New" />
                        <MenuItem Header="Delete" Command="Delete" IsEnabled="True" />
                    </ContextMenu>
                </ListView.ContextMenu>
                <ListViewItem />  
            </ListView>            
        </Grid>
    </Grid>
</Window>

Методы для окна:

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("ok");
}

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = true;
    e.Handled = true;
}

1 Ответ

5 голосов
/ 28 февраля 2011

Фокус необходим для вызова CommandBinding.CanExecute. Поскольку при выборе элемента в ListView фокус смещается на ListView; оценка может произойти.

Если бы вы поместили listView.Focus(); в свой конструктор Window, вы бы заметили, что CommandBinding.CanExecute теперь вызывается, как и ожидалось, и, следовательно, включается, если элемент не содержится или не выбран внутри ListView.

Перемещение привязки к Window по-прежнему требует установки фокуса в Window; либо с помощью явного вызова в конструкторе, либо с помощью других средств; например ... выбор элемента в ListView или другого элемента управления в Window, который может получить фокус.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...