Galasoft RelayCommand не стреляет - PullRequest
0 голосов
/ 10 марта 2011

Я использую среду MVVM Light для создания приложения SL4.Мое простое приложение состоит в основном из одного основного представления (shellView), которое разделено на несколько пользовательских элементов управления.Это просто удобное разделение пользовательского интерфейса, поэтому у них нет собственной ViewModel.

ShellView содержит Keypad (пользовательский пользовательский контроль), который содержит несколько кнопок Keypad (пользовательский пользовательский контроль).

Я совершенно уверен (потому что я проверил), что DataContext настроен правильно и используется всеми пользовательскими элементами управления в иерархии.(Datacontext ShellView - это ShellViewModel, DataContext клавиатуры - ShellViewModel и т. Д.).

В ShellViewModel у меня есть ICommand (RelayCommand) с именем «ProcessKey».

В элементе управления клавиатуры у меня есть что-то вроде:

<controls:KeypadButton x:Name="testBtn" Text="Hello">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding PressStandardKeyCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
</controls:KeypadButton>

Клавиатура KeypadButton - это, по сути, Grid, который содержит кнопку.Событие MouseLeftButtonUp перехватывается, и запускается пользовательское событие «Click».Позвольте мне показать вам некоторый код, чтобы легко объяснить, что я делаю:

public partial class KeypadButton : UserControl
{
    public delegate void KeypadButtonClickHandler(object sender, RoutedEventArgs e);
    public event KeypadButtonClickHandler Click;

public KeypadButton()
{
        // Required to initialize variables
    InitializeComponent();
}

    private void innerButton_Click(object sender, MouseButtonEventArgs e)
    {
        if (Click != null)
            Click(sender, new KeypadButtonEventArgs());
    }
}

public class KeypadButtonEventArgs : RoutedEventArgs
{
    public string test { get; set; }
}

Теперь, если я установлю точку останова для тела innerButton_Click, я могу видеть, что Click правильно перехвачен и содержит точки наRelayCommand.Однако ничего не происходит: «Click (отправитель, новый KeypadButtonEventArgs ());»выполняется, но не более того.

Почему это так?Не должны ли выполнить целевую функцию, определенную в RelayCommand?Может быть, проблема связана с областью?

Заранее спасибо, Ура, Джанлука.

Ответы [ 2 ]

1 голос
/ 10 марта 2011

Как отмечается в других комментариях, это, вероятно, связано с тем, что событие Click не является RoutedEvent.

Для быстрого взлома вы можете использовать MouseLeftButtonDown вместо события Click на вашем UserControl.

<!-- Kinda Hacky Click Interception -->
<controls:KeypadButton x:Name="testBtn" Text="Hello">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseLeftButtonDown">
                <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding PressStandardKeyCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
</controls:KeypadButton>

Другой вариант, который вы могли бы рассмотреть - наследование от Button вместо UserControl. В Silverlight Show есть статья о наследовании от TextBox , которая, вероятно, имеет к этому отношение.

0 голосов
/ 10 марта 2011

Маршрутизируемые события должны быть определены следующим образом ( см. Документацию ):

public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
    "Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonSimple));

// Provide CLR accessors for the event
public event RoutedEventHandler Tap
{
        add { AddHandler(TapEvent, value); } 
        remove { RemoveHandler(TapEvent, value); }
}
...