Привязка нескольких команд Silverlight в MVVM - PullRequest
1 голос
/ 29 января 2011

Я начинаю создавать приложение Silverlight, используя MVVM.У меня есть кнопка на странице XAML, чтобы включить сохранение данных по ее щелчку. Я написал следующий код:

 <Button Content="Save" Grid.Column="2" Grid.Row="3"
                    Command="{Binding Path=SaveCourse}"/>

, а в классе модели представления у меня есть следующий код:

public class SaveCurrentCourse : ICommand
        {
            private MaintenanceFormViewModel viewModel;
            public SaveCurrentCourse(MaintenanceFormViewModel viewModel)
            {
                this.viewModel = viewModel;
                this.viewModel.PropertyChanged += (s, e) =>
                    {
                        if (this.CanExecuteChanged != null)
                        {
                            this.CanExecuteChanged(this, new EventArgs());
                        }
                    };   
            }
            public bool CanExecute(object parameter)
            {
                return this.viewModel.CurrentCourse != null;
            }

            public event EventHandler CanExecuteChanged;

            public void Execute(object parameter)
            {
                this.viewModel.SaveCourseImplementation();
            }
        }

Какой тип работает для моей команды сохранения.У меня вопрос: если на странице несколько кнопок, нужно ли мне писать для каждой кнопки один и тот же код?Может ли какой-либо орган предложить лучший способ?

1 Ответ

1 голос
/ 29 января 2011

Команда Microsoft по шаблонам и практикам предлагает библиотеку Prism, которая несколько упрощает эту задачу.http://compositewpf.codeplex.com/

Они предоставляют класс с именем DelegateCommand, который реализует ICommand и позволяет передавать имя метода, который вы хотели бы выполнить.

public class Test {
    public Test(){
        SomeCommand = new DelegateCommand<object>(DoSomething);
    }
    public DelegateCommand<object> SomeCommand { get; private set;}
    private void DoSomething(object parameter){
        //Do some stuff
    }
}

Затем вы можете привязать свойство Command ваших элементов управления к SomeCommand.Вы также можете привязать CommandParameter к чему-либо, и он будет передан в качестве параметра в метод DoSomething.Дополнительный конструктор для DelegateCommand позволяет передавать метод CanExecute в качестве второго параметра, который включает / отключает элемент управления.Если вам нужно обновить статус включенного / отключенного элемента управления, вы можете вызвать метод DelegateCommand RaiseCanExecuteChanged().

public class Test {
    public Test(){
        SomeCommand = new DelegateCommand<object>(DoSomething, (enabled) => CanSave());
    }
    public DelegateCommand<object> SomeCommand { get; private set;}
    private void DoSomething(object parameter){
        //Do some stuff
    }
    private bool CanSave(){
        if(/*test if the control should be enabled */)
            return true;
        else
            return false;
    }
    private void DoABunchOfStuff(){
        //something here means the control should be disabled
        SomeCommand.RaiseCanExecuteChanged();
    }
}
...