【问题标题】:How does one "disable" a button in WPF using the MVVM pattern?如何使用 MVVM 模式“禁用”WPF 中的按钮?
【发布时间】:2011-03-29 10:45:06
【问题描述】:

我正在尝试掌握 WPF 和 MVVM 并取得了不错的进展。 WPF 和 MVVM 方面进展顺利。

但是,XAML 和数据绑定方面完全是另一回事 :)

我将如何“禁用”按钮?

例如,我的视图模型中有一个 CanClose 属性,用于确定当前是否可以关闭应用程序。如果工作线程停止执行某项操作,则此属性设置为 false,我想将按钮设为灰色,或者通过某种绑定以某种方式在视觉上禁用关闭按钮。

我该怎么做呢?

谢谢!

编辑 -

可惜我只能接受一个答案。

这两个答案对我帮助很大。在 Kent 的帖子中,他更进一步解释了为什么应该在应用程序中实现命令基础架构,而不是按照我要求的方式禁用按钮:

How does one "disable" a button in WPF using the MVVM pattern?

我原来的问题的答案:

How does one "disable" a button in WPF using the MVVM pattern?

【问题讨论】:

    标签: c# wpf xaml .net-3.5


    【解决方案1】:

    只需将 Button 的 IsEnabled 属性绑定到 CanClose:

    <Button IsEnabled="{Binding CanClose}"/>
    

    【讨论】:

    • 不可能,真的那么容易吗?我不知道我怎么能忽略这一点。让我试试看。
    • 谢谢,我不敢相信我竟然忽略了这么简单的问题答案。
    • 值得注意的是,如果您采用 MVVM 方法并且您正在使用 Commands 及其 CanExecute 属性,根据微软文档,您不应该使用 IsEnabled 属性。它在文档中并标记为重要:docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/…
    【解决方案2】:

    通过使用命令模式。在您的视图模型中:

    public class MyViewModel : ViewModel
    {
        private readonly ICommand someCommand;
    
        public MyViewModel()
        {
            this.someCommand = new DelegateCommand(this.DoSomething, this.CanDoSomething);
        }
    
        public ICommand SomeCommand
        {
            get { return this.someCommand; }
        }
    
        private void DoSomething(object state)
        {
            // do something here
        }
    
        private bool CanDoSomething(object state)
        {
            // return true/false here is enabled/disable button
        }
    }
    

    在您的 XAML 中:

    <Button Command="{Binding SomeCommand}">Do Something</Button>
    

    阅读this post 以了解有关DelegateCommand 的更多信息。

    【讨论】:

    • 不错的链接,感谢您提供的信息。我会在今天下午有更多空闲时间时阅读整本书。我认为 DelegateCommand 是您自己实现的命令模式,还是我在 .net 框架中缺少的东西?
    • @IanP DelegateCommand 是 Prism 的一部分,这似乎是当今编写 WPF 应用程序的实际方式......
    • 嗯.. 不知道 DelegateCommand 做了什么,这并没有像我希望的那样帮助我.. 哈哈
    • 啊——Kent 在他的博客上有一个示例 DelegateCommand 实现的链接。再次感谢!
    • 不幸的是,链接已经失效,这使得这个答案毫无用处。
    【解决方案3】:

    如果返回 ICommand 的 CanExecute 值为 false,则 Button 将被禁用。所以无论你的按钮绑定到什么命令,当你想禁用它时,看看你是否可以返回 CanExecute 一个 false 值。

    【讨论】:

      【解决方案4】:

      这也有效:

      查看

              <Button>
                  <Button.Style>
                      <Style>
                          <Setter Property="Content" Value="Scream" />
                          <Style.Triggers>
                              <DataTrigger Binding="{Binding btnEnabled}" Value="True">
                                  <Setter Property="IsEnabled" Value="True" />
                              </DataTrigger>
                          </Style.Triggers>
                      </Style>
                  </Button.Style>
              </Button>
      

      视图模型

          private bool _btnEnabled;
          public bool btnEnabled
          {
              get { return _btnEnabled; }
              set
              {
                  if (_btnEnabled != value)
                  {
                      _btnEnabled = value;
                      OnPropertyChanged();
                  }
              }
          }
      

      【讨论】:

        【解决方案5】:

        ViewModel 文件的变化:

        公共布尔 IsButtonEnabled { 得到 { 返回 _isButtonEnabled; }

        set
        {
            if (_isButtonEnabled == value)
            {
                return;
            }
        
            _isButtonEnabled = value;
            OnPropertyChanged("IsButtonEnabled");
        }
        }
        
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        

        按钮的 XAML 文件中的更改:IsEnabled="{Binding IsButtonEnabled}"

        【讨论】:

          猜你喜欢
          • 2012-09-08
          • 1970-01-01
          • 1970-01-01
          • 2012-12-12
          • 2019-02-01
          • 2019-12-13
          • 2022-08-03
          • 1970-01-01
          • 2013-07-03
          相关资源
          最近更新 更多