使用ViewModel中的一些Action将View后面的代码连接起来

时间:2014-02-14 22:15:28

标签: c# silverlight mvvm

在使用MVVM编写的Silverlight应用程序中,我希望根据某些内容启用/禁用我的视图。

在代码后面的View类的构造函数中,我可以这样说,它会禁用表单:

public MyForm1View()
{
    InitializeComponent();
    if(this.DataContext == null)
    {
       this.IsEnabled = False;
    }
}

问题是当没有数据要加载时,我在表单顶部向用户显示一个灰色覆盖屏幕,并在该灰色覆盖上显示“创建新记录”....现在问题是,如果我禁用上面那样的表单,那么当他们点击CreateNewRecord链接时如何重新启用它呢?

但是如何从视图模型中再次重新启用它呢?也许我应该在我的ViewModel上有一个Action,当它在ViewModel上被调用时,它会调用一个方法,该方法在View后面的代码中连接?但是如何编写这个想法呢?

1 个答案:

答案 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,如果你使用它的话。

希望有所帮助。