C# 绑定";已启用";变量的控件属性

C# 绑定";已启用";变量的控件属性,c#,winforms,C#,Winforms,我在一些类似的帖子中发现了一个问题,但是,它们并不完全相同,我不太确定如何将其应用到我的场景中。它们可能与我的情况相同,也可能不同。所以,我在这里发布我自己的问题,希望我能得到我的具体场景的答案 基本上,我有一个窗口窗体和一组控件。我希望能够将它们的Enabled属性绑定到我设置的布尔变量,以便它们可以根据我的判断启用或禁用 public partial class MyUI : Form { private int _myID; public int myID {

我在一些类似的帖子中发现了一个问题,但是,它们并不完全相同,我不太确定如何将其应用到我的场景中。它们可能与我的情况相同,也可能不同。所以,我在这里发布我自己的问题,希望我能得到我的具体场景的答案

基本上,我有一个窗口窗体和一组控件。我希望能够将它们的Enabled属性绑定到我设置的布尔变量,以便它们可以根据我的判断启用或禁用

public partial class MyUI : Form
{
    private int _myID;
    public  int  myID 
    {
        get
        {
            return _myID;;
        }
        set
        {
            if (value!=null)
            {
                _bEnable = true;
            }
        }
    }
    private bool _bEnable = false;
    public bool isEnabled
    {
        get { return _bEnable; }
        set { _bEnable = value; }
    }

    public myUI()
    {
        InitializeComponent();
    }

public void EnableControls()
{
   if (_bEnable)
   {
    ctl1.Enabled = true;
    ctl2.Enabled = true;
            ......
    ctl5.Enabled = true;
   }
       else
   {
    ctl1.Enabled = false;
    ctl2.Enabled = false;
            ......
    ctl5.Enabled = false;
       }
}
}
}

上面的方法EnableControls可以满足我的需要,但它可能不是最好的方法。我更喜欢将ctrl1..5绑定到我的变量\u bEnable。变量将根据用户输入的一个字段而变化,如果数据库中存在该字段中的值,则将启用其他控件以供用户更新,否则将禁用这些控件

我在这里找到了 但是数据绑定到文本字段。如何摆脱EnableControls方法并将_bEnabled的值绑定到每个控件中的“Enabled”属性?

查看MVVM(Model-View-ViewModel)模式,特别是它在Windows窗体中的实现。将它应用于WPF/Silverlight应用程序要容易得多,但您仍然可以在Windows窗体中使用它,而不会遇到太多麻烦

要直接解决您的问题,您需要做两件事:

  • 创建一些类来保存您的内部状态(即按钮是否已启用)。这个类必须实现。这将是MVVM模式中的视图模型
  • 将上面1.)中的类的实例绑定到表单。您的表单是MVVM模式中的视图
  • 完成上述1和2之后,您可以更改类的状态(即,将表示按钮是否已启用的属性从true更改为false),表单将自动更新以显示此更改

    下面的代码应该足以让这个概念发挥作用。显然,您需要扩展它,但它应该足以让您开始

    查看模型

    public class ViewModel : INotifyPropertyChanged
    {
        private bool _isDoStuffButtonEnabled;
        public bool IsDoStuffButtonEnabled
        {
            get
            {
                return _isDoStuffButtonEnabled;
            }
            set
            {
                if (_isDoStuffButtonEnabled == value) return;
                _isDoStuffButtonEnabled = value;
                RaisePropertyChanged("IsDoStuffButtonEnabled");
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void RaisePropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    查看

    public class View : Form
    {
        public Button DoStuffButton { get; set; }
    
        public void Bind(ViewModel vm)
        {
            DoStuffButton.DataBindings.Add("Enabled", vm, "IsDoStuffButtonEnabled");
        }
    }
    
    用法

    public class Startup
    {
        public ViewModel ViewModel { get; set; }
        public View View { get; set; }
    
        public void Startup()
        {
            ViewModel = new ViewModel();
            View = new View();
    
            View.Bind(ViewModel);
    
            View.Show();
    
            ViewModel.IsDoStuffButtonEnabled = true;
    
            // Button becomes enabled on form.
    
            // ... other stuff here.
        }
    }
    

    也许您可以尝试这种方法:在
    isEnabled
    属性的setter方法中,添加if语句:

    if(_bEnable) EnableControls();
    else DisableControls();
    
    如果你的控件名是ctl1,ctl2。。。等等。您可以尝试以下方法:

    EnableControls()
    {
       for(int i=1; i<6;i++)
       {
          string controlName = "ctl" + i;
          this.Controls[controlName].Enabled = true;
       }
    }
    
    EnableControls()
    {
    
    例如(int i=1;iYou正在与应用程序的状态进行“角力”。这是设计应用程序时常见的问题。看看一些著名的设计模式,如MVP、MVC或MVVM。这很优雅,这也是我所缺少的。我将在MVVC中挖掘更多信息以了解更多信息,但您的答案已经让我开始……)非常感谢!我想我需要多读一些关于MVVM的书,这对我来说是新的。我还没有机会/奢侈地这么做,但我有一个关于你解释的快速跟进问题,我想“我理解”.因此,如果我理解正确,用法/启动应该在另一个名为Model的类中,并且可以安全地说,根据您上面的解释,视图不会“说话”直接发送到ViewModel,但只接收来自ViewModel的指令?现在,如果视图发生更改,View如何将更改传回ViewModel或Model?就像用户在文本框中键入内容一样?根据您要绑定到的Windows窗体控件的哪个属性,可能会进行双向绑定。双向绑定是t两端的帽子更改会被传达(就像文本框值被输入到它绑定到的视图模型的属性中一样)你读过了吗?它有点像标准Windows窗体开发的范式转换,但它有很多原因,谢谢。链接我会看一下。它看起来像C++的文档视图模式。这很好。