привязка ICommand к пользовательскому обработчику событий - PullRequest
3 голосов
/ 04 августа 2011

Я пытаюсь создать пользовательский контроль в datapager. Этот пользовательский элемент управления имеет одно событие, объявленное в его коде:

public event EventHandler OnPageIndexPagerChanged;

Я использую этот элемент управления в основном пользовательском контроле и привязываю свое событие к другому событию в коде, например:

xaml:

OnPageIndexPagerChanged="SuperDataPager_OnPageIndexPagerChanged"

c # (код позади):

private void SuperDataPager_OnPageIndexPagerChanged(object sender, EventArgs e)
        {
            var viewModel = DataContext as ViewSchedeConsuntiviViewModel;

            if (viewModel != null)
            {
                viewModel.FilterCommand.Execute(sender);
            }
        }

И это прекрасно работает, но я бы хотел пропустить прохождение кода позади и сделать что-то вроде:

OnPageIndexPagerChanged="{Binding Path=FilterCommand}"

Это, я уже делаю для кнопки фильтра, присутствующей в моем основном пользовательском контроле, поэтому я подумал, что могу сделать то же самое для этого события. Но каждый раз я получаю сообщение об ошибке:


Невозможно ассемблировать 'Super.Silverlight.SuperDataPager.OnPageIndexPagerChanged. [Строка: 90 Позиция: 55]


«iexplore.exe» (Silverlight): загружен «C: \ Program Files (x86) \ Microsoft» Silverlight \ 4.0.60531.0 \ it \ mscorlib.resources.dll 'su System.Windows.Application.LoadComponent (Объектный компонент, Uri resourceLocator) su Super.Silverlight.SchedeConsuntivi.InitializeComponent () su Super.Silverlight.SchedeConsuntivi..ctor ()

Извините за ошибку на итальянском языке, но мне не удалось получить точный перевод -> (невозможно назначить свойство ...)

Может ли кто-нибудь объяснить мне это поведение?

Спасибо за чтение,

[EDIT] Вот мой взгляд Модель для основного управления пользователем:

 public class MyViewModel : DependencyObject, INotifyPropertyChanged
{
      public ICommand FilterCommand { get; set; }

      public MyViewModel()
      {
         FilterCommand = new Super.Silverlight.Tools.DelegateCommand<object>(p => Filter());
      }

    public void Filter()
    {
        //....blah blah blah...
    }
}

[/ EDIT]

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Прежде всего, ваше событие не является RoutedEvent , что вы должны учитывать.Но это не главная проблема.

Конечно, вы не можете установить ICommand для EventHandler.Не путайте RoutedEvents с RoutedCommands.У вас есть 2 варианта, вы можете присвоить свой UserControl свойство зависимости типа ICommand и просто запустить его внутри своего кода.В XAML теперь вы можете связать свою команду.Или, если вы хотите использовать это как событие, снова подумайте об использовании RoutedEvents, есть опции для привязки команд к событиям маршрута, например EventBehaviorFactory и некоторые другие.

Самым простым решением было бы использоватьICommand прямо в вашем пользовательском управлении и удалить событие.

0 голосов
/ 04 августа 2011

Боюсь, что вы не можете этого сделать, потому что Команда - это перенаправленное событие особого типа, вместо этого чтение спецификации DataPager не поддерживает какие-либо команды.Вместо этого в коде присваивается событие.

РЕДАКТИРОВАТЬ

Вы также можете иметь обходные пути, но это не обязательно будет таким, как вы хотите.

С уважением.

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