【问题标题】:Bind IsEnabled property for Button in WPF在 WPF 中为 Button 绑定 IsEnabled 属性
【发布时间】:2018-05-14 13:27:55
【问题描述】:

我有一个Button,需要以编程方式启用/禁用。我想通过绑定到bool 来实现这一点。这是按钮 XAML:

<Button x:Name="logInButton" Height="30" IsEnabled="{Binding IsLoggedIn}">
                            <Image Source="/images/img.png"></Image>
                        </Button>

这里是被调用的代码:

        public MainWindow()
        {
            InitializeComponent();
            enabled = false;
        }
        private bool enabled;
        public bool IsLoggedIn
        {
            get
            {
                return enabled;
            }
            set
            {
                enabled = value;
            }
        } 

属性IsLoggedIn 的值已正确分配。但是IsEnabled 没有分配我需要的值。例如:

我尝试使用 Binding PathBinding Source 设置值,但没有任何效果。

请告知可能出了什么问题。

【问题讨论】:

  • 除非您将数据上下文分配给控件,否则IsLoggedIn 必须是视图模型中的属性,而不是后面的视图代码中的属性(如果您的数据上下文是视图,那么现在恢复它。 ..)
  • 如果在 GUI 加载后更改 IsLoggedIn,则需要让 WPF 系统知道该值已更改。将 IsLoggedIn 声明为 DependencyProperty 或实现 INotifyPropertyChanged

标签: c# wpf binding


【解决方案1】:

那么……我想一定是这样。

class Model : INotifyPropertyChanged
    {
        public bool enabled;
        public bool IsLoggedIn
        {
            get
            {
                return enabled;
            }
            set
            {
                enabled = value;
                OnPropertyChanged("IsLoggedIn");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string property = "")
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

【讨论】:

  • 将 Model 的一个实例分配给 MainWindow 的 DataContext 属性。例如。添加private Model viewModel = new Model();之类的字段,并在MainWindow构造函数中添加DataContext = viewModel;
  • 嗯,它应该工作。将 enabled 字段设为私有,以避免从 Model 类外部意外访问它。
  • @Clemens,谢谢,当我设置IsEnabled="{Binding Path = IsLoggedIn}" 时,它真的很有帮助,但对于另一个按钮,它应该具有与登录按钮相反的属性,但在IsEnabled="{Binding Path = !IsLoggedIn} 上不起作用。
  • !IsLoggedIn 不是 WPF 数据绑定中的有效属性路径。要么添加另一个属性,要么编写一个反转布尔值的绑定转换器。
  • 赞成,因为这个视图模型几乎就是这样完成的。顺便说一句,CallerMemberName 属性意味着你可以在这里写OnPropertyChanged()。对于倒置,你不妨按照 Clemens 的建议做一个值转换器。您可能需要再次反转布尔值(至少这是我的经验)。
【解决方案2】:

缺少两件事:

  1. IsLoggedIn 属性应该在DataContext 对象中。在 MVVM 中,这意味着它应该在视图模型中。
  2. DataContext 应该实现 INotifyPropertyChanged,以便在您以编程方式更新属性时视图可以更改。

【讨论】:

  • 我现在真的无法给出更长的答案,这里正在发生一些事情。
  • OP 现在已经回答得差不多了,我想我会赞成。
猜你喜欢
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多