Кнопка WPF в всплывающем окне не срабатывает и замораживает управление - PullRequest
1 голос
/ 16 июля 2011

У меня есть всплывающее окно в пользовательском элементе управления, который всплывает с событием mouseenter. Всплывающее окно и кнопка отображаются нормально. Когда я нажимаю на кнопку, элемент управления зависает и не запускает команду. Чтобы разморозить, я должен свернуть окно.

Всплывающий код выглядит следующим образом:

<Popup Name="Popup_PrevButton"
       PlacementTarget="{Binding ElementName=PART_Button}"
       Placement="Left" 
       StaysOpen="False"
       AllowsTransparency="True" 
       PopupAnimation="Fade"
       Focusable="True">
     <Grid>
           <Button
           Name="Button_PrevButton"
           Margin="2,0,2,0" 
           Width="20" 
           Height="48"
           BorderBrush="{TemplateBinding BorderBrush}" 
           BorderThickness="{TemplateBinding BorderThickness}" 
           Foreground="{TemplateBinding Foreground}"
           Command="{Binding Path=Button_NextButton}">
           </Button>
      </Grid>
</Popup>

Если я использую Click = Button_NextButton, я получаю сообщение об ошибке: Не удалось создать «щелчок» из текста «Button_NextButton».

Обновление

Я обновил свой код и реализовал класс RelayCommand в соответствии с предложением. Я изменил привязку на

Command="{Binding Path=nCommand:CustomCommands.Button_Click}">

Я уверен, что связал команду (изменяя вещи, я ломаю программу, чтобы она не запускалась - например: если я удалю подпрограмму, то получаю ошибку, что подпрограмма не существует), но когда я нажимаю на кнопку, происходит то же самое.

Команда кнопки выглядит следующим образом:

Private Sub ON_Button_Click(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
    'Do something here
End Sub

Код для nCommand: Public Shared Button_PrevButton_Click As New RoutedCommand ("Button_PrevButton_Click", GetType (MainWindow))

Связывание в MainWindow:

Так что в основном я знаю, что компилятор видит вещи, но когда я нажимаю, он не передает его в подпрограмму. есть еще мысли?

Ответы [ 2 ]

1 голос
/ 17 июля 2011

Свойство Command кнопки должно быть привязано к чему-либо в объекте, заданном как DataContext, который реализует интерфейс ICommand (как упоминалось в H.B.).

Простой способ добиться этого - использовать класс-оболочку, который содержит большую часть механики реализации ICommand. Вот ссылка на хорошую вводную статью о MVVM, содержащую реализацию класса RelayCommand, которая делает это.

Вся статья отлично читается, но вы можете перейти к разделу «Relaying Command Logic», чтобы увидеть реализацию.

Надеюсь, это поможет!

1 голос
/ 17 июля 2011

Если вы получили такую ​​ошибку, подпись метода, которую вы создали в коде, была неправильной, например, указано MouseEventArgs вместо общего RoutedEventArgs.

Кроме того, я не вижу проблем с этим битом XAML, если связывание фактически связывается с командой, которая не делает некоторые довольно странные вещи, которые она должна работать. Тот факт, что кнопка находится во всплывающем окне, не должен быть проблемой.

...