Команда не запускается при нажатии кнопки - PullRequest
1 голос
/ 08 декабря 2011

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

Это сводило меня с ума, и в итоге я создал тестовую страницу, на которой не было ничего, кроме кнопки. Для контекста страницы задано значение моей ViewModel, а для ViewModel установлено свойство ICommand. DataContext работает, так как я могу привязать текстовое поле к строковому свойству во ViewModel. Это так просто, я могу включить все соответствующие вещи здесь:

Из XAML:

xmlns:models="clr-namespace:x3.ViewModels"

...

<UserControl.DataContext>
<models:TestViewModel/>
</UserControl.DataContext>
<Button x:Name="TestButton" Command="{Binding TestCommand}" Content="AAAAGHH" />

Из ViewModel:

public class TestViewModel:INotifyPropertyChanged
{
  ICommand _testCommand;
  public ICommand TestCommand
  {
    get
    {
      _testCommand = new DelegateCommand(
        commandParameter =>
        {
          var testButton = commandParameter as Button;
        },
        (commandParameter) => {return true;});
      return _testCommand;
    }
  }
}

DelegateCommand является частью Telerik.Windows.Controls. Если я поставлю точку останова на _testCommand = новый DelegateCommand это происходит, когда страница загружается, но после этого я могу нажимать кнопку, пока моя мышь не изнашивается и команда никогда не вызывается.

Ради моего психического здоровья я был бы признателен за любую предлагаемую помощь.

Спасибо

Mick

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Метод доступа get для TestCommand вызывается только один раз - когда механизм привязки связывает Command из Button со свойством TestCommand.Поместив точку останова в первую строку get, следует ожидать, что она получает удар только один раз.

Вам нужно просто поставить точку останова на код, который выполняется при запуске вашей команды.В вашем исходном примере это означает разрыв внутри делегата - т.е. на return true.

Edit: вы можете заставить отладчик также нарушить код, используя System.Diagnostics.Debugger.Break():

  ICommand _testCommand;
  public ICommand TestCommand
  {
    get
    {
      _testCommand = new DelegateCommand(
        commandParameter =>
        {
          var testButton = commandParameter as Button;
        },
        (commandParameter) => 
        {
          System.Diagnostics.Debugger.Break(); // Force debugger to break
          return true;
        }
      );
      return _testCommand;
    }
  }
1 голос
/ 08 декабря 2011

Чтобы изолировать проблему, попробуйте использовать собственную простую реализацию ICommand вместо Telerik DelegateCommand.

Если проблема все еще возникает, вы будете знать, что это где-то около вашей привязки XAML / данных, и тогда я бы посоветовал вам опубликовать более полные части кода, чтобы кто-то здесь мог помочь вам.

Если проблема исчезнет, ​​вы узнаете, что это что-то в Telerik DelegateCommand, которое решает не называть вашу лямбду.

Если вы можете опубликовать более полное воспроизведение проблемы, это также может помочь. Потому что вы разместили только минимальную часть своего кода, и, возможно, причина проблемы здесь отсутствует ...

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