Winform-> WPF MVVM Ошибка связывания клавиш? - PullRequest
1 голос
/ 06 октября 2010

Мне нужна помощь в работе WPF KeyBindings при вызове из приложения WinForm.Я создал, как мне кажется, основные части, чтобы продемонстрировать проблему.Я могу предоставить пример приложения, если это поможет.

Приложение WinForm запускает форму, содержащую кнопку, которая вызывает WPF

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim view As New WpfPart.MainWindow
    System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(view)
    view.ShowDialog()
End Sub

С представлением WPF создается его модель представления и настраиваетсясочетания клавиш:

<Window x:Class="WpfPart.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:WpfPart.ViewModels"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <vm:MainWindowViewModel />
</Window.DataContext>
<Window.InputBindings>
    <KeyBinding Key="Escape" Command="{Binding OpenCommand}" Modifiers="Control" />
</Window.InputBindings>
<Grid>

</Grid>

ViewModel использует команду DelagateCommand, чтобы надеяться связать все воедино

using System;
using System.Windows;
using System.Windows.Input;
using WpfPart.Commands;

namespace WpfPart.ViewModels
{
class MainWindowViewModel
{
    private readonly ICommand openCommand;

    public MainWindowViewModel()
    {
        openCommand = new DelegateCommand(Open, CanOpenCommand);
    }

    public ICommand OpenCommand { get { return openCommand; } }
    private bool CanOpenCommand(object state)
    {
        return true;
    }

    private void Open(object state)
    {
        MessageBox.Show("OpenCommand executed.");
    }
}
}

Кто-нибудь может увидеть, где происходит ошибка, нажатие клавиши ничего не делает?!

Ответы [ 2 ]

1 голос
/ 07 октября 2010

Чтобы заставить KeyBinding работать, вам нужно добавить CommandReference в Window.Resources, а затем ссылаться на CommandReference из KeyBinding (не Command).

Я также использовал Control-X, чтобы не открывать кнопку «Пуск» в Windows, которая отображается на Control-Escape.

Вот XAML, который вы можете использовать на основе вашего вопроса:

<Window.Resources>
    <!-- Allows a KeyBinding to be associated with a command defined in the View Model  -->
    <c:CommandReference x:Key="OpenCommandReference" Command="{Binding OpenCommand}" />
</Window.Resources>
<Window.InputBindings>
    <KeyBinding Key="X" Command="{StaticResource OpenCommandReference}" Modifiers="Control" />
</Window.InputBindings>
0 голосов
/ 17 апреля 2013

В моем проекте я использовал решение: Предположим, что ListView содержит элементы DummyViewModel с командой CmdDelete, и мне нужно вызвать эту команду при выбранном элементе, перед клавишей Delete

<Grid>
    <Button x:Name="DeleteCmdReference" Visibility="Collapsed" Command="{Binding Source={x:Reference MyListView},Path=SelectedItem.CmdDelete}" />
    <ListView x:Name="MyListView" ...="" >
      <ListView.InputBindings>
        <KeyBinding Key="Delete" Command="{Binding ElementName=DeleteCmdReference,Path=Command}"/>
      </ListView.InputBindings>
    </ListView>
  </Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...