2010-01-19 3 views
3

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

Вот 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, но выполнение не переходит к методу. Я видел много примеров (также в потоке stackoverflow), но не могу понять, как следует указывать привязку.

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

Спасибо.

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

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

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

+1

Существуют ли какие-либо ошибки привязки в выводе программы? Ошибки привязки часто остаются необнаруженными. Вы также должны попробовать Snoop. Это инструмент, который подключается к вашему запущенному приложению и может также выявлять ошибки привязки. – Thorsten79

ответ

10

Что вы пытаетесь сделать, это связать непосредственно с методом Save. Это не так, как это сделать.

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

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

Вы не должны вызывать NotifyPropertyChanged("SaveCommand");.

+0

Большое спасибо! гениальный простой :) Теперь я получил, как это работает :) P.S. Я бы добавил оценку к ответу, но пока не получил достаточного количества баллов. – Budda

Смежные вопросы