代码之家  ›  专栏  ›  技术社区  ›  Ian P

如何使用MVVM模式“禁用”WPF中的按钮?

  •  20
  • Ian P  · 技术社区  · 15 年前

    我正在努力掌握WPF和MVVM,并取得了良好的进展。WPF和MVVM方面进展顺利。

    但是,XAML和数据绑定端是另一回事:)

    我该如何“禁用”按钮?

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

    我该怎么做呢?

    谢谢!

    编辑-

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

    这两个答案对我帮助很大。在肯特的文章中,他进一步解释了为什么你应该在你的应用程序中实现一个命令基础设施,而不是像我所要求的那样禁用一个按钮:

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

    我最初的问题的答案是:

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

    4 回复  |  直到 9 年前
        1
  •  31
  •   Tim Cooper    14 年前

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

    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 .

        2
  •  36
  •   Quartermeister    15 年前

    只要绑定 IsEnabled 要关闭的按钮的属性:

    <Button IsEnabled="{Binding CanClose}"/>
    
        3
  •  10
  •   Akash Kava    15 年前

    如果返回canexecute of icommand值false,则按钮将被禁用。因此,无论您的按钮绑定到什么命令,当您想要禁用它时,看看您是否可以返回canexecute值false。

        4
  •  1
  •   usefulBee    9 年前

    这也是可行的:

    视图 :

            <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();
                }
            }
        }