在使用MVVM编写的Silverlight应用程序中,我希望根据某些内容启用/禁用我的视图。
在代码后面的View类的构造函数中,我可以这样说,它会禁用表单:
public MyForm1View()
{
InitializeComponent();
if(this.DataContext == null)
{
this.IsEnabled = False;
}
}
问题是当没有数据要加载时,我在表单顶部向用户显示一个灰色覆盖屏幕,并在该灰色覆盖上显示“创建新记录”....现在问题是,如果我禁用上面那样的表单,那么当他们点击CreateNewRecord链接时如何重新启用它呢?
但是如何从视图模型中再次重新启用它呢?也许我应该在我的ViewModel上有一个Action,当它在ViewModel上被调用时,它会调用一个方法,该方法在View后面的代码中连接?但是如何编写这个想法呢?
答案 0 :(得分:2)
我会建议一些事情:
ICommand Interface的简单包装器:
public class DelegateCommand : ICommand
{
private readonly Action execute;
private readonly Func<bool> canExecute;
public DelegateCommand(Action execute, Func<bool> canExecute = null)
{
this.execute = execute;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
if (this.canExecute != null)
{
return this.canExecute();
}
else
{
return true;
}
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
execute();
}
public void RaiseExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, new EventArgs());
}
}
}
ViewModel:
public class ViewModel : INotifyPropertyChanged {
public void ViewModel() {
SwitchCommand = new DelegateCommand(() => this.IsEnabled = true, () => true);
}
public DelegateCommand SwitchCommand {get;set;}
private bool isEnabled;
public bool IsEnabled {
get {
return isEnabled;
}
set {
isEnabled = value;
NotifyPropertyChanged("IsEnabled");
}
// here, InotifyPropertyChanged implementation, dozens of sample available
}
的Xaml:
例如:
<Button Command={Binding SwitchCommand} /> bind command to click.
所以,剩下的就是通过视图构造函数将ViewModel设置为View,如果你使用它的话。
希望有所帮助。