WPF MVVM: привязка ICommand к элементам управления - PullRequest
3 голосов
/ 19 января 2010

Я полностью потерял привязку команды, которая используется в MVVM. Как мне привязать мой объект к окну и / или его команду к элементу управления, чтобы получить метод, вызываемый для Button Click?

Вот класс CustomerViewModel:

public class CustomerViewModel : ViewModelBase
{
    RelayCommand _saveCommand;
    public ICommand SaveCommand
    {
        get
        {
            if (_saveCommand == null)
            {
                _saveCommand = new RelayCommand(param => this.Save(), param => this.CanSave);
                NotifyPropertyChanged("SaveCommand");
            }
            return _saveCommand;
        }
    }

    public void Save()
    {
        ...
    }

    public bool CanSave { get { return true; } }

    ...

ViewModelBase реализует интерфейс INotifyPropertyChanged Вот как Button привязан к команде:

<Button Content="Save" Margin="3" Command="{Binding DataContext.Save}" />

Экземпляр CustomerViewModel назначен на DataContext окна, содержащего Button.

Данный пример не работает: я поставил точку останова в методе Save, но выполнение не передается методу. Я видел много примеров (в том числе и над стеком), но не могу понять, как следует указывать привязку.

Пожалуйста, сообщите, любая помощь будет оценена.

Спасибо.

P.S. Вероятно, мне нужно указать RelativeSource в привязке кнопки ... что-то вроде этого:

 Command="{Binding Path=DataContext.Save, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"

но какой тип должен быть указан для предка?

1 Ответ

10 голосов
/ 19 января 2010

То, что вы пытаетесь сделать, это привязать напрямую к методу Save. Это не то, как это сделать.

Предполагая, что вы установили DataContext вашего View для экземпляра CustomerViewModel, вы привязываетесь к SaveCommand следующим образом:

<Button Content="Save" Margin="3" Command="{Binding SaveCommand}" />

Вам не нужно звонить NotifyPropertyChanged("SaveCommand");.

...