我开始使用MVVM构建Silverlight应用程序。 我在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();
}
}
我的保存命令适用于哪种方式。 我的问题是,如果页面上有多个按钮,那么我是否必须为每个按钮编写与上面相同的代码? 任何人都可以提出更好的方法吗?
答案 0 :(得分:1)
微软的模式&amp;实践团队提供了一个名为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();
}
}