WPF - CanExecute не срабатывает при вызове команд из UserControl - PullRequest
2 голосов
/ 16 июля 2009

У меня есть пользовательский контроль на кнопочной панели, который я хочу иметь в большинстве моих форм.

Я добавил команды следующим образом ...

    public ICommand Create
    {
        get
        {
            return buttonCreate.Command;
        }
        set
        {
            buttonCreate.Command = value;
        }
    }

Я установил их как свойства зависимостей, чтобы я мог связываться с ними ...

        public static readonly DependencyProperty CreateCommandProperty =
        DependencyProperty.Register(
        "Create",
        typeof(ICommand),
        typeof(StandardButtonStrip),
        new PropertyMetadata((ICommand)null));

Затем я привязываю свой usercontrol к команде ...

<commoncontrols:StandardButtonStrip HorizontalAlignment="Stretch" Create="{Binding CreateCommand}" />

Я настраиваю команду следующим образом ...

_viewModel.CreateCommand = new DelegateCommand<object>(OnCreateCommand, CanCreate);

но несмотря на то, что я всегда возвращаю true в моем методе CanCreate, кнопка отключается ... если я поставлю точку останова на return true, она никогда не сработает!

    public bool CanCreate(object parm)
    {
        return true;
    }

Я пробовал это, чтобы увидеть, обновит ли оно привязку, но не радость!

_viewModel.CreateCommand.RaiseCanExecuteChanged();

Думаю, проблема в пользовательском элементе управления и в том, как я передаю Команду как свойство, но не уверен ...

Может кто-нибудь помочь?

Приветствия

Andy

Ответы [ 3 ]

5 голосов
/ 16 июля 2009

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

Прежде всего, является ли ваша модель представления объектом DependencyObject?

Если это так, вы должны понизить его до класса, который реализует INotifyPropertyChanged. Зачем? Поскольку свойство Command для Button является самим DependencyProperty (унаследованным от ButtonBase) и уже поддерживает привязку данных.

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

Что вы должны сделать, это использовать модель представления в качестве DataContext для вашего элемента управления (я полагаю, у вас уже есть эта настройка). Затем измените CreateCommand вашей модели представления на обычный ICommand и привяжите свойство Command createButton следующим образом (в стандартном стиле StandardButtonStrip)

<Button Name="createButton" HorizontalAlignment="Stretch" Command="{Binding CreateCommand}" />

Таким образом, он все равно будет использоваться повторно, вам просто нужно убедиться, что любая модель представления, связанная с вашим пользовательским элементом управления, имеет свойство CreateCommand типа ICommand (и эта модель представления будет наследоваться вплоть до элемента управления кнопкой по умолчанию - одна из самых приятных вещей, придуманных парнями из wpf).

Итак, подведем итоги, вы должны сделать это наоборот, более или менее.

Надеюсь, это было полезно, ура.

1 голос
/ 13 октября 2009

Одна оговорка к принятому ответу -

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

Command<T> : DelegateCommand<T> и подключил Диспетчер команд.

event EventHandler ICommand.CanExecuteChanged 
{ 
 add { CommandManager.RequerySuggested += value; }
 remove { CommandManager.RequerySuggested -= value; }
} 
0 голосов
/ 16 июля 2009

Переопределили ли вы какие-либо функции пользовательского элемента управления?

Одной из распространенных проблем является переопределение метода без вызова реализации базы. Например, если вы переопределили OnContentChanged() без вызова base.OnContentChanged(), возможно, вы случайно отключили запуск события ContentChanged.

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