【问题标题】:Binding to base viewmodel command from View从视图绑定到基本视图模型命令
【发布时间】:2012-10-02 18:50:19
【问题描述】:

我有一个基本视图模型和两个派生的视图模型。在我的基本视图模型中,我有一些命令 CloseCommand、CancelCommand 等。

我的视图附加到派生的视图模型之一。我需要将一个按钮绑定到基本视图模型中的 CloseCommand。 如何通过继承做到这一点?

我已将按钮的内容与基本 viewModel 中的字符串属性绑定,并且工作正常,但是如何绑定命令?

【问题讨论】:

    标签: silverlight mvvm binding command viewmodel


    【解决方案1】:

    只要将这些命令公开为 ViewModel 的公共属性,您无需做任何特别的事情来绑定这些命令。我有同样的情况,所以这是我自己的实现方式。

    首先在您的基类中定义 ICommand 类型的 OKCommand / CancelCommand。就 Execute 和 CanExecute 方法而言,我将它们定义为受保护的虚拟方法(顺便说一下,您还可以将命令定义为虚拟。这将使您能够编写 XAML 样式,将按钮的可见性模式设置为折叠,如果它命令值为空)。在派生的 ViewModel 中,您只需根据需要覆盖命令、Execute 和 CanExecute 方法,但从您的角度来看,您始终只需直接绑定到命令名称。

    以下是我刚刚向您解释的示例。

    public abstract class ViewModelbase
    {
        private DelegateCommand _okCommand;
        public virtual DelegateCommand OkCommand
        {
            get { return _okCommand ?? (_okCommand = new DelegateCommand(OkExecuteCommand, CanOkExecute)); }
        }
    
        protected virtual void OkExecuteCommand()
        {
            DialogResult = true;
        }
    
        protected virtual bool CanOkExecute()
        {
            return IsValid;
        }
    }
    

    然后您只需定义从基本 ViewModel 类派生的具体 ViewModel 类

    public class SampleViewModel : ViewModelbase
    {
       //If u have defined XAML style which sets viability of button as collapsed if its command value is null u simply override command
       public override DelegateCommand OkCommand { get { return null; } }
        protected override void OkExecuteCommand()
        {
            do whatever u want as this is a command execution
        }
    }
    

    在 XAML 部分中,您不必做任何特别的事情,只需将您的按钮命令绑定到 Viewmodel 命令,就像没有基类时所做的那样。 这里的关键是您应该使用 public 修饰符从基础 ViewModel 类中公开命令(您只需要 getter,因此此代码提供了您可以公开命令的一种方式的示例)

    【讨论】:

      【解决方案2】:

      没什么特别的,这是你需要做的:

      1. 将 View 的 DataContext 设置为派生的 ViewModel
      2. 确保例如 CloseCommand 在您的 ViewModelBase 中声明为公共属性
      3. 将按钮的 Command 属性设置为“{Binding CloseCommand}”

      【讨论】:

      • 非常感谢@Alan。问题已解决,将命令公开。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 2022-01-09
      • 2014-11-08
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多